Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Express(node.js)-res.send仅发送响应的一部分_Javascript_Node.js_Post_Express - Fatal编程技术网

Javascript Express(node.js)-res.send仅发送响应的一部分

Javascript Express(node.js)-res.send仅发送响应的一部分,javascript,node.js,post,express,Javascript,Node.js,Post,Express,我从使用express框架的res.send中得到一些奇怪的行为 以下是我的功能: user.register(function(err, result) { console.log(JSON.stringify(err || result)); res.send(JSON.stringify(err || result)); }); 它接收错误或结果对象。以下是console.log中的一个示例: 但是,客户收到的答复是: {"name":"AuthError","messa

我从使用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
我收到的任何错误都会发生这种情况。我不明白为什么会发生这种情况,因为我只是试图发送一个简单的JSON字符串。有人能告诉我这可能是什么原因吗

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

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


这是因为在第一个函数完成user.register函数之前调用了multiple res.send where,如果我没有适当地退出它,它将进行多次回调调用吗?控制台中没有记录异常。

我没有看到对res.end的调用; 此外,如果您多次调用res.send,则它可能会接受我收到的错误:

我没有看到抛出任何错误,直到我更改了res.end的调用时间。也许这也发生在你身上。我认为res.send想要为body size设置标题,因此再次调用它将使已发送的标题无效


如果在res.send之前调用res.end,或者在res.end之前调用另一个res.send,则它可能不会传输其他部分,那么到目前为止,我的测试似乎没有出现任何错误。

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


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

您不必在调用res.send之前对对象进行字符串化-它会为您执行此操作,并适当地设置内容类型。@josh3736这非常有用,谢谢。您已经验证了响应JSON在客户端被截断了吗?您已经检查了浏览器控制台/调试器或其他什么?@Pointy我实际上已经解决了这个问题,但是我仍然希望您能解释一下为什么会发生这种情况,请参阅“在帖子中编辑”。@GeorgeReith很可能是异常会导致输出缓冲区被取消刷新。
{"name":"AuthError","message":"Password confirmation does not match
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)