我使用快速框架从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()
函数将进行多次回调调用)?控制台中没有记录任何异常。
答案 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版本会在控制台中通知这些情况。