我应该如何在Javascript中使用node.js和Mongodb实现asynchronousfunction?

到目前为止,我已经看到,有setTimeout()process.nextTick(function)的asynchronousfunction,但我不知道如何使用它。 我试过我的代码,因为我现在需要一个asynchronousfunction,但它将Can't set headers after they are sent.

这是我的代码:

 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); } else{ 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, doc) { if(err){ res.send(err); } else{ //setTimeout(function(){ res.send(doc); //},2000); } res.end(); db.close(); }); }); } } 

基本上我试图实现一个asynchronous函数,以便它将执行updateRecord之前发送一个响应在下面,因为现在没有setTimeout ,所有我得到它[]由于执行两个同时。 这是我通过邮递员testing的web api。 任何帮助表示赞赏,谢谢!

更新:最后它的工作! 然而,我的输出包含在它里面,因为我没有在db中放\ ,所以这很奇怪。 这是根据下面的罗马Maksimov代码。

 [ "{\"_id\":\"18A\",\"Inventory for NTA SAM Cards\":\"\",\"Item Description\":\"Auresys EZL Prod\",\"Corrupted QTY\":\"\",\"Closing QTY\":\"100\",\"Remarks\":\"\",\"Opening QTY\":\"1000\",\"Issued QTY\":\"100\"}", "{\"_id\":\"20\",\"Inventory for NTA SAM Cards\":\"\",\"Item Description\":\"Auresys EZL Prod\",\"Corrupted QTY\":\"\",\"Closing QTY\":\"100\",\"Remarks\":\"\",\"Opening QTY\":\"1000\",\"Issued QTY\":\"100\"}", "null" ] 

cursor.each是asynchronous的,所以,它内部的callback可能会达到意想不到的效果。

一个简单的方法来实现你想要的是从游标中删除each函数,并使用mongodb的toArray方法。 在toArraycallback中添加最后一个callback

 var cursor = db.collection('documents').find({ 'Item Description': req.body.itemDescrip, 'Issued QTY': req.body.issueQty }).toArray(function(err, docs) { if (err) { return callback(err); } return callback(null, docs) }); 

似乎你是在Node.js下做的(对吗?)。 从你的描述来看,你并不清楚你到底想要达到什么目的。 但是,很显然,由于您已经结束了响应,因此您无法将响应发送给响应(从这一点起响应已经发送给客户端,当然也不可能写入响应)。 尝试这个:

 updateRecord(db, req, function(err, doc) { if(err){ res.send(err); res.end(); } else { setTimeout(function(){ res.send(doc); res.end(); }, 2000); } db.close(); });