gpt4 book ai didi

javascript - 我应该如何使用 node.js 和 Mongodb 在 Javascript 中实现异步函数?

转载 作者:行者123 更新时间:2023-11-30 15:19:02 24 4
gpt4 key购买 nike

到目前为止,我已经看到异步函数有 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 一样,我得到的只是它 [] 由于同时执行两者。这是我通过 postman 测试的 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"
]

最佳答案

cursor.each 是异步的,因此,在其中包含回调可能会产生意想不到的结果。

实现你想要的更简单的方法是从游标中删除 each 函数并使用 mongodb 的 toArray 方法。在 toArray 回调中添加最终回调

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)
});

关于javascript - 我应该如何使用 node.js 和 Mongodb 在 Javascript 中实现异步函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44040862/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com