Express(node.js) - res.send只发送部分响应

时间:2013-08-14 21:10:34

标签: javascript node.js post express

我使用快速框架从res.send()获得了一些奇怪的行为。

这是我的功能:

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()(如果我没有适当地退出它,user.register()函数将进行多次回调调用)?控制台中没有记录任何异常。

2 个答案:

答案 0 :(得分: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(),则可能无法传输其他部分,那么我的测试中似乎没有出现任何错误,远。

答案 1 :(得分:0)

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

在我的情况下,我两次致电返回res.json()。确保你没有做同样的事情。 New Express版本会在控制台中通知这些情况。