Express(node.js)-res.send只发送部分响应
Express (node.js) - res.send only sending part of response
我使用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版本会在控制台中通知这些情况。
- 如何将getJson的响应保存在全局变量中
- 循环结束/推送到数组之前在页面上呈现EJS
- 将值输入到对象,然后该对象推送到数组
- Firebase2(Firebase.google.com)推送通知-从外部管理
- 如何使用Spring MVC将Facebook返回的响应数据保存在Java类中
- 使用angularjs向浏览器发送servlet响应(下载功能)
- MockJax没有在JavaScript应用程序中发送对我AJAX请求的响应
- 不再使用innerHTML进行AJAX响应.(代码未得到响应)
- 为什么可以't我使用了AJAX响应的一部分
- 通过另一个php应用程序将我的项目推送到Github存储库中
- 响应动画手风琴不工作
- 如何在javascript中推送数组值
- 如何从SeleniumWebdriver获取异步Javascript响应
- 从 PHP 读取 json 响应并推送到 javascript 多维数组中
- 如何实现推送页面的 JQuery 或 CSS3 响应式侧边菜单
- 将 PHP Array 推送到 AJAX 响应中 JQuery 数组
- 在 Android 中响应原生 Cloudkit 推送通知
- 在Node JS中,数组推送会在响应后永远持续
- 管理在数组中推送JSON响应或使用regexp进行匹配
- 响应式侧边栏推送菜单