node.js app:抛出新的错误('不能在发送后设置标题。')

时间:2016-10-25 14:49:28

标签: javascript node.js

我有以下代码:

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”语句?

3 个答案:

答案 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 ..."。但由于响应之前已经发送给客户,因此您收到错误"发送后无法设置标头"