Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.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
Node.js 为什么?错误:Can';t在发送邮件后设置邮件头_Node.js - Fatal编程技术网

Node.js 为什么?错误:Can';t在发送邮件后设置邮件头

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

我不断收到此错误:错误:发送邮件后无法设置邮件头。

我读过其他帖子,但我不明白。我没有任何双重回电或任何事情。在我的代码中,哪里导致了此错误

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)
正如我在评论中所说的,这个问题几乎总是由异步操作的不当处理引起的,这会导致响应的各个部分被无序调用

根据使用
.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
  });