【发布时间】:2015-06-08 07:16:11
【问题描述】:
这是一个从数据库中查询用户的示例,如果用户存在,则另一个查询电话:
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
}
我的问题是:根据这段代码,正确的设置位置在哪里 返回下一个(); ?为什么?
我提出了一些建议:
位置 A:@ 函数底部。在这里它甚至会被称为 早于从数据库中查询数据
位置B:@第一个回调函数的底部
位置C:@最后一个回调函数的底部
位置 D:在 res.send(..) 之后立即
P.S:我知道我可以将错误作为对象传递到 next.. 我只是想简化代码以专注于主要问题。
谢谢yokefellows,'。
【问题讨论】:
-
如果您发送回复,您根本不需要使用
next? -
在 Restify Doc 中:"您负责调用 next() 以运行链中的下一个处理程序。如下所示,您可以传入一个 Error 对象以使 restify 自动返回响应到客户。” mcavage.me/node-restify ... 所以建议使用 res.send .. 但是在哪里?
-
啊,好的,谢谢你的链接。我原以为只有在您想继续链条时才需要它,但如果您想短路,似乎也需要致电
next(false)。可能 restify 需要做一些清理工作。
标签: javascript node.js nonblocking restify