Async / Await无法在循环内插入数据

时间:2018-02-01 14:57:18

标签: node.js promise async-await

我有一些记录的对象数组,我想在循环中插入这些记录,但它不起作用。

req.notifications(对象数组):

[ { user_group: 'reporter',
    notification_type: 'email,dashboard',
    parent_id: 1 },
  { user_group: 'assignee',
    notification_type: 'email',
    parent_id: 1 },
  { user_group: 'superadmin',
    notification_type: 'sms,dashboard',
    parent_id: 1 } ]

模特功能:

exports.notificationAdd = async function(req, callback) {
    var notifications = req.notifications; 
    var _err = [];
    await Promise.all(notifications.map(async (notification) => {
        var schemaObj = new NotificationSchema(notification);
        await schemaObj.save(function(err, created){
            if(err){ _err.push(err); }
        });
    }));
    if(_err.length > 0) {
        callback({ code: 400, status: 'error', message: "Unable to add notification", data: _err});
    } else {
        callback({ code: 200, status: 'success', message: 'Notification successfully added!'});
    }
};

我收到以下错误:

\App\myProject\node_modules\mongodb\lib\utils.js:132
      throw err;
      ^

TypeError: Cannot read property '0' of null

我看到了数据库,只插入了一条记录。当我调试代码时,我已经看到循环进入下一个计数器而不执行循环内的save函数,只是在上次执行save函数时。

谢谢。

1 个答案:

答案 0 :(得分:0)

您需要使用for...of来解决循环内的承诺。

像这样(未经测试):

for(let notification of notifications){
  try {
    var schemaObj = new NotificationSchema(notification);
    await schemaObj.save();
  } catch (e) {
    _err.push(err)
  }
}

尽量不要将回调模式与承诺模式混合