Node.js 不断得到错误:Can';t在发送邮件后设置邮件头

Node.js 不断得到错误:Can';t在发送邮件后设置邮件头,node.js,mongodb,Node.js,Mongodb,因此,我正在尝试更新代码,并将其显示给用户。基本上,它能够做我需要做的事情,但在执行之后,我得到了这个错误 C:\Users\tester01\u 2\myproject\node\u modules\mongodb core\lib\cursor.js:174 犯错误; ^ 错误:发送邮件后无法设置邮件头。 在ServerResponse.OutgoingMessage.setHeader(_http_outgoing.js:357:11) 在ServerResponse.header( C:

因此,我正在尝试更新代码,并将其显示给用户。基本上,它能够做我需要做的事情,但在执行之后,我得到了这个错误

C:\Users\tester01\u 2\myproject\node\u modules\mongodb core\lib\cursor.js:174 犯错误; ^ 错误:发送邮件后无法设置邮件头。 在ServerResponse.OutgoingMessage.setHeader(_http_outgoing.js:357:11) 在ServerResponse.header( C:\Users\tester01\u 2\myproject\node\u modules\express\lib\response.js:725:10) 在ServerResponse.send (C:\Users\tester01\u 2\myproject\node\u modules\express\lib\response.js:170:12) 在C:\Users\tester01\u 2\myproject\dbUpdate.js:13:14 在C:\Users\tester01\u 2\myproject\dbUpdate.js:28:5 在handleCallback(C:\Users\tester01\u 2\myproject\node\u modules\mongodb- core\lib\cursor.js:171:5) 在下一个功能中(C:\Users\tester01\u 2\myproject\node\u modules\mongodb- core\lib\cursor.js:682:5) at Cursor.next[作为_next] (C:\Users\tester01\u 2\myproject\node\u modules\mongodb- core\lib\cursor.js:692:3) at环路 (C:\Users\tester01\u 2\myproject\node\u modules\mongodb\lib\cursor.js:694:8) 每个 (C:\Users\tester01\u 2\myproject\node\u modules\mongodb\lib\cursor.js:741:16)

这是我的代码

var MongoClient = require('mongodb').MongoClient;
var assert = require('assert');
var url = 'mongodb://localhost:27017/myproject';

module.exports = {

postCollection : function(req, res){
    var issueQty = req.body.issueQty;
    var itemDescrip = req.body.itemDescrip;
MongoClient.connect(url, function(err, db) {
    assert.equal(null, err);
    updateRecord(db, req, function(doc) {
    return res.send('Record Found. Now updating this document...' + 
itemDescrip + ' Record Updated. This is the new record ' + doc )
    res.end();
    db.close();
    });

});
}
}
var updateRecord = function(db, req, callback) {
var cursor = db.collection('documents').find({'Item Description': 
req.body.itemDescrip, 'Issued QTY': req.body.issueQty})
cursor.each(function(err,doc){
   assert.equal(err, null);
     if(doc != err){
         console.log('Successfully queried');
         console.log(doc);
         callback(JSON.stringify(doc));

     } else{
         throw err;
     }
  });
db.collection('documents').updateMany(
  { 'Item Description': req.body.itemDescrip},
  {
    $set: { 'Issued QTY': req.body.issueQty }
  },function(err, results) {
    console.log(results);
    console.log('Done');
    console.log(results);

});
};

我认为这与我的res有关,因为我看到的所有res线程都处于错误的位置,但我需要将我的
res.send
放在那里,以便它可以使用
doc
。有没有办法解决这个问题?谢谢

首先,您应该删除
res.send()前面的
return

其次,在
updateRecord
函数中,不应在循环中调用
回调
函数,它将执行多次。然后在执行
updateMany
之前关闭数据库

如果要发送文档,应该使用临时数组保存文档,并在完成updateRecord中的所有逻辑后将其传递给res

如果我理解正确,以下是我对您代码的修改

var MongoClient = require('mongodb').MongoClient;
var url = 'mongodb://localhost:27017/myproject';

var updateRecord = function(db, req, callback) {
    db.collection('documents').updateMany({ 'Item Description': req.body.itemDescrip }, {
        $set: { 'Issued QTY': req.body.issueQty }
    }, function(err, results) {
        if (err) return callback(err);
        console.log('Done');
        console.log(results);
        var cursor = db.collection('documents').find({
            'Item Description': req.body.itemDescrip,
            'Issued QTY': req.body.issueQty
        });
        var temp = [];
        cursor.each(function(err, doc) {
            if (err) {
                return callback(err);
            }
            console.log('Successfully queried');
            console.log(doc);
            temp.push(JSON.stringify(doc));
        });
        callback(null, temp);
    });
};

module.exports = {
    postCollection: function(req, res) {
        var issueQty = req.body.issueQty;
        var itemDescrip = req.body.itemDescrip;
        MongoClient.connect(url, function(err, db) {
            if(err) {
              res.send(err);
              res.end();
              db.close();
              return;
            }
            updateRecord(db, req, function(err, docs) {
                if(err){
                  res.send(err);
                }
                else{
                  res.send(docs);
                }
                res.end();
                db.close();
            });

        });
    }
}

@OngKongTat我更新了我的答案,你应该检查你的updateRecord函数两次。对不起,我没有真正理解你所说的循环,你是指函数还是for/while循环等?因为我有点困惑,你怎么知道什么时候放db.close()。@OngKongTat cursor.each是一个循环,你的回调函数在updateMany之前被调用,因此,在调用updateMany之前调用db.close。我无法将带有doc的临时数组传递给res,因为doc将是未定义的,因为doc是在另一个函数中的函数中声明的,所以我不知道应该如何调整该函数,以便doc能够在后收集中使用。@OngKongTat我已更新我的回答,你可以看看我是否理解正确。