这并不能完全解决您的问题,但使用Promise语法可能有助于稍微清理您的函数。有了Mongo节点驱动程序,如果省略回调,Mongo会给你一个承诺,你可以这样做
then
.
function updateBeer(req, res, next) {
var query = {
'_id': req.query.id
};
Brew
.find(query)
.then((result) => {
if (result.length === 1)
res.render('updatebeer', {
brew: result[0]
});
})
.catch((err) => {
return next(err);
});
}
app.get('/updatebeer', updateBeer);
下面代码的问题是,正如node告诉您的那样,
res
updateBeer
,但不是
renderBeer
:
function updateBeer(req, res, next){
var query = {'_id':req.query.id};
Brew.find(query, renderBeer);
}
function renderBeer(err, result){
if(err)
return next(err); // There is no "next" in this scope
if(result.length===1)
res.render('updatebeer', {brew: result[0]}); // There is no "res" in this scope either
}
app.get('/updatebeer', updateBeer);
我甚至建议将你的程序分解成一种MVC结构,在这种结构中,所有与啤酒相关的东西都被放在一个啤酒模型中,你的面向路线的啤酒东西都在你的啤酒控制器中。从你开始,你已经有了啤酒视图的内容
res.render("updatebeer")
function beerTransformer(beerResult) {
if (beerResult.length !== 1) {
throw new Error("THERE'S NO BEER!!!");
}
return Promise.resolve(beerResult[0]);
}
啤酒控制器
function updateBeer(req, res, next) {
var query = {
'_id': req.query.id
};
Brew
.find(query)
.then(beerTransformer)
.then((beer) => {
// Very thin, delegates all beer related things to the model
return res.render("updatebeer", {
brew: beer
});
})
.catch((err) => {
return next(err);
});
}
app.get('/updatebeer', updateBeer);