【发布时间】:2017-10-17 20:40:04
【问题描述】:
到目前为止,我已经看到有 setTimeout(),process.nextTick(function) 用于异步功能,但是我不知道如何使用它。我已经尝试过我的代码,因为我现在需要一个异步函数,但它会有 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();
});
});
}
}
基本上我正在尝试实现一个异步函数,以便它首先执行updateRecord,然后在下面发送响应,因为现在没有setTimeout,我得到它[],因为两者同时执行。这适用于我正在通过邮递员测试的 web api。任何帮助表示赞赏,谢谢!
更新:
终于成功了!但是我的输出中包含\,这很奇怪,因为我没有将\放入数据库中。这是根据下面的 Roman 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"
]
【问题讨论】:
标签: javascript node.js mongodb asynchronous