【问题标题】:node.js app: throw new Error('Can\'t set headers after they are sent.')node.js app: throw new Error('Can\'t set headers after they are sent.')
【发布时间】:2016-10-26 22:16:34
【问题描述】:

我有以下代码:

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

【问题讨论】:

  • 点击return确实退出函数。但是在您的情况下,它退出了您传递给.hget回调,您仍然在.get('/:widget' ...) 内。

标签: javascript node.js


【解决方案1】:

“redis.hget”是一个异步调用。由于“redis.hget”是一个异步调用,你的“router.get”函数一直执行到最后,它遇到“res.status(200).send(“你为什么在这里?”)”并因此发送对客户的回应。

现在,在下一个事件循环中,异步函数“redis.hget”被执行,在从 Redis 服务器获得响应后,再次调用“res.status(400).send...”。但是由于之前已经将响应发送给客户端,因此您会收到错误“发送后无法设置标头”

【讨论】:

    【解决方案2】:

    function (e, d) { ... } 是一个异步调用的不同函数。

    function(req, res, next) { ... } 返回不会停止该函数的运行(反之亦然)。

    鉴于您总是function (e, d) { ... } 内部发送响应,因此尝试从 function(req, res, next) { ... } 发送响应也是没有意义的。

    【讨论】:

      【解决方案3】:

      您的 return 语句在一个回调函数中(您传递给 redis.hget() 的那个)。你的 return 语句让你摆脱了这种状态,但是你继续到 router.get() 函数的末尾。

      【讨论】:

        猜你喜欢
        • 2015-08-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多