1

我从res.send()使用 express 框架中得到了一些奇怪的行为。

这是我的功能:

user.register(function(err, result) {
    console.log(JSON.stringify(err || result));
    res.send(JSON.stringify(err || result));
});

它要么接收错误,要么接收结果对象。以下是来自的示例console.log()

{"name":"AuthError","message":"Password confirmation does not match original password","code":36}

但是客户端收到的响应是:

{"name":"AuthError","message":"Password confirmation does not match

我收到的任何错误都会发生这种情况。我不明白为什么会发生这种情况,因为我只是试图发送一个简单的 JSON 字符串。谁能告诉这可能的原因是什么?

编辑:我已经解决了这个问题,但如果有人能解释它背后的原因,我将不胜感激。

user.register()每当发生错误时,我都忘记退出该函数,尽管如此,它仍继续查询数据库。一旦我确定该函数已正确退出,就会收到完整的响应......但这可能是什么原因?

是因为res.send()在第一个完成之前调用了多个 where(user.register()如果我没有正确退出,该函数会进行多个回调调用)?控制台中没有记录异常。

4

2 回答 2

0

我没有看到对 res.end(); 的调用 如果您不止一次调用 res.send 似乎也有可能,那么它可能会吞下我得到的错误:

http.js:707
    throw new Error('Can\'t set headers after they are sent.');
          ^
Error: Can't set headers after they are sent.
    at ServerResponse.OutgoingMessage.setHeader (http.js:707:11)
    at ServerResponse.res.setHeader (C:\projects\javascript\node\node_modules\express\node_modules\connect\lib\patch.js:59:22)
    at ServerResponse.res.set.res.header (C:\projects\javascript\node\node_modules\express\lib\response.js:518:10)
    at ServerResponse.res.contentType.res.type (C:\projects\javascript\node\node_modules\express\lib\response.js:390:15)
    at ServerResponse.res.send (C:\projects\javascript\node\node_modules\express\lib\response.js:107:14)
    at readyToEnd (C:\projects\javascript\node\spawn.js:43:10)
    at Socket.<anonymous> (C:\projects\javascript\node\spawn.js:22:40)
    at Socket.EventEmitter.emit (events.js:117:20)
    at _stream_readable.js:910:16
    at process._tickCallback (node.js:415:13)

在我更改res.end()被调用的时间之前,我没有看到任何错误。也许这也发生在你身上。我在res.send()想要为正文大小设置标头,因此再次调用它会使已发送的标头无效。

如果res.end()之前被调用res.send()或另一个res.send()res.end()它可能不会传输另一部分之前被调用,那么到目前为止我的测试似乎没有发生错误。

于 2013-08-23T18:38:06.353 回答
0

我在 Express 3.3.4 上遇到了类似的问题,在更新到 Express 3.15.0 后,我找到了问题代码。

就我而言,我两次调用了return res.json()。确保你没有做同样的事情。新的 Express 版本会在控制台中通知这些情况。

于 2014-09-12T13:24:11.427 回答