我正在尝试遍历对象数组,其中每个对象都包含猫鼬文档的唯一标识符及其“可用”数量:[{sku:“ ABCD”,可用:5}]。在每个循环中,我将在MongoDB中定位文档,更新“ available”属性,然后保存文档。这似乎造成了异步的噩梦,因为在服务器将响应发送回前端之前,.forEach循环似乎没有完成。
我一直在尝试使用async / await解决问题,但显然不了解在何时何地使用它们。
var Product = require("../models/models").Product;
const rows = [ { sku: 'ABCD', available: '12' },
{ sku: 'EFGH', available: '42' },
{ sku: 'IJKL', available: '33' } ];
const updateRows = async _rows => {
let _rowsUpdated = 0;
_rows.forEach(async row => {
await Product.findOne({ sku: row.sku }, async (err, _prod) => {
if (err) {
return console.log(err);
}
_prod.available = row.available;
const res = await _prod.save();
if (res) _rowsUpdated++;
});
});
return _rowsUpdated;
};
const rowsUpdated = await updateRows(rows);
console.log(rowsUpdated);
所有这些都包装在异步router.post()回调中。
当记录rowsUpdated时,它返回零,但是我希望它返回3,因为在updateRows()函数完成之前,它不应该移动通过该行。