Node.js 为什么?错误:Can';t在发送邮件后设置邮件头
我不断收到此错误:错误:发送邮件后无法设置邮件头。 我读过其他帖子,但我不明白。我没有任何双重回电或任何事情。在我的代码中,哪里导致了此错误 Error: Can't set headers after they are sent. at ServerResponse.OutgoingMessage.setHeader (http.js:689:11) at ServerResponse.header (/root/node_modules/express/lib/response.js:666:10) at ServerResponse.send (/root/node_modules/express/lib/response.js:146:12) at fn (/root/node_modules/express/lib/response.js:900:10) at View.exports.renderFile [as engine] (/root/node_modules/jade/lib/jade.js:330:12) at View.render (/root/node_modules/express/lib/view.js:93:8) at EventEmitter.app.render (/root/node_modules/express/lib/application.js:530:10) at ServerResponse.res.render (/root/node_modules/express/lib/response.js:904:7) at Query. (/root/tutsplus/server4.js:25:7) at Query.emit (events.js:98:17)Node.js 为什么?错误:Can';t在发送邮件后设置邮件头,node.js,Node.js,我不断收到此错误:错误:发送邮件后无法设置邮件头。 我读过其他帖子,但我不明白。我没有任何双重回电或任何事情。在我的代码中,哪里导致了此错误 Error: Can't set headers after they are sent. at ServerResponse.OutgoingMessage.setHeader (http.js:689:11) at ServerResponse.header (/root/node_modules/express/lib/respons
正如我在评论中所说的,这个问题几乎总是由异步操作的不当处理引起的,这会导致响应的各个部分被无序调用 根据使用
.on()
的代码示例,您只需要在以下情况下结束请求:
query.on('end', function() {
// all rows have been received
});
我认为您可能不止一次调用了res.render()
,因为您是在query.on('result',…)
中调用它,而不是在query.on('end',…)
中调用它,在收集完所有数据之后
事实上,你是在:
query.on('result', ...)
可能是错误的时间问题导致了问题
mysql nodejs连接器文档中有一个示例:
var query = connection.query('SELECT * FROM posts');
query
.on('error', function(err) {
// Handle error, an 'end' event will be emitted after this as well
})
.on('fields', function(fields) {
// the field packets for the rows to follow
})
.on('result', function(row) {
// Pausing the connnection is useful if your processing involves I/O
connection.pause();
processRow(row, function() {
connection.resume();
});
})
.on('end', function() {
// all rows have been received
});
这个特殊的错误几乎总是因为异步操作处理不当而导致发送响应时出现顺序错误。我的代码中是否有任何东西导致了这个问题?我应该在哪里查找?请发布错误的堆栈跟踪(
error.stack
)。OP修改了他的Q以删除对res.end()
@Dai的调用-很难跟上不断变化的问题。另外一个问题是,在收到所有数据之前,他们不应该调用res.render()
。要点是,应该收集所有数据,然后在接收到所有数据后,可以使用res创建响应。render()
@Dai结果将针对每一行发出。如果有多行,res.render()
将被多次调用。
var query = connection.query('SELECT * FROM posts');
query
.on('error', function(err) {
// Handle error, an 'end' event will be emitted after this as well
})
.on('fields', function(fields) {
// the field packets for the rows to follow
})
.on('result', function(row) {
// Pausing the connnection is useful if your processing involves I/O
connection.pause();
processRow(row, function() {
connection.resume();
});
})
.on('end', function() {
// all rows have been received
});