以下是从数据库查询用户的示例,如果用户存在,则另一个查询电话:
module.exports = function (username, req, res, next) {
var query = User.where('username', new RegExp('^' + username + '$', 'i'));
query.findOne(function (err, user) {
if (err) {
res.send("error");
//## position D
} else if (!user) {
res.send("user not found");
//## position D
} else {
//user exists
//search for phone
var query2 = Phone.where('phone', new RegExp('^' + user.phone + '$', 'i'));
query2.findOne(function (err, phone) {
if (err) {
res.send("error");
//## position D
} else if (!phone) {
res.send("phone not found");
//## position D
} else {
res.send(phone);
//## position D
}
//## position C
});
}
//## position B
});
//## position A
}
我的问题是:基于此代码,设置的正确位置在哪里 返回next(); ?为什么?
我提出了一些建议:
位置A:@函数的底部。在这里它甚至会被称为 早于查询数据库中的数据
位置B:@第一回调函数的底部
位置C:@最后一个回调函数的底部
位置D:立即在res.send(..)之后
P.S:我知道我可以将错误作为对象传递到下一个..我只是想让代码变得简单,专注于主要问题。
感谢yokefellows,'。
答案 0 :(得分:1)
绝对是位置D,但你可以拥有一些东西"更清洁"回调。
module.exports = function (username, req, res, next) {
var query = User.where('username', new RegExp('^' + username + '$', 'i'));
query.findOne(function (err, user) {
if (err) {
return next(err);
}
if (!user) {
res.send("user not found");
return next();
}
//user exists
//search for phone
var query2 = Phone.where('phone', new RegExp('^' + user.phone + '$', 'i'));
query2.findOne(function (err, phone) {
if (err) {
return next(err);
}
if (!phone) {
res.send("phone not found");
} else {
res.send(phone);
}
next();
});
});
}