我有以下代码:
router.get('/:widget', function(req, res, next) {
var widget = req.params.widget;
if ( ! validate(widget) ) {
res.status(400).send("Invalid widget");
return;
}
redis.hget("e:" + widget, 'ccid', function (e, d) {
if (e){
res.status(500).send("Database query failed");
return;
}
if (d) {
res.status(200).send("Resource found");
return;
} else {
res.status(400).send("Unknown widget");
return;
}
});
res.status(200).send("why are you here?");
return;
});
我的印象是,当代码点击“返回”时...它会退出该功能。 但似乎正在发生的事情是当逻辑击中时:
res.status(400).send("Unknown widget");
return;
路径,它仍然击中
res.status(200).send("why are you here?");
return;
也是。我以为它会退出这个方法。 显然,我错了......因为我收到了上述错误信息。当我在redis.hget调用之后删除res.send()和return()时,错误消失了。
在每个res.status()。send()之后我应该使用什么而不是“return”语句?
答案 0 :(得分:1)
function (e, d) { ... }
是一个不同的函数,异步调用。
从function(req, res, next) { ... }
返回不会使该功能停止运行(反之亦然)。
鉴于您总是从function (e, d) { ... }
内部发送回复,尝试从function(req, res, next) { ... }
发送回复也没有意义。
答案 1 :(得分:1)
您的return语句位于回调函数中(您传递给redis.hget()
的函数)。您的返回语句会将您从中删除,但随后您将继续执行router.get()
函数的结束。
答案 2 :(得分:1)
" redis.hget"是异步调用。作为" redis.hget"是一个异步调用,你的" router.get"函数继续执行到最后,遇到" res.status(200).send("你为什么在这里?")"并将响应发送给客户。
现在,在下一个事件循环中,异步函数" redis.hget"得到执行后,从Redis服务器获得响应后,再次调用" res.status(400).send ..."。但由于响应之前已经发送给客户,因此您收到错误"发送后无法设置标头"