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

Express (node.js) - res.send only sending part of response

本文关键字:送部 响应 send -res node js Express      更新时间:2023-09-26

我使用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()函数会进行多个回调调用)?控制台中没有记录任何异常。

我没有看到对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.send()之前调用res.end(),或者在res.end()之前调用另一个res.send(),它可能不会传输其他部分,那么到目前为止,我的测试似乎没有出现错误。

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

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