首页 > 解决方案 > 在 foreach 循环中更新数据库

问题描述

当我运行这段代码

router.post('/admin', ensureAuthenticated, async (req, res) => {
    try {
        const{ truckDriver, truckNumber, admin, customer, loadPlanning } = req.body;
        await User.find({isVerified: true}, function(err,data){
            adminArray = data;
            for(var key in req.body) {
                if(req.body.hasOwnProperty(key)){
                    adminArray.forEach(function(data){
                        if(truckDriver == data.email){
                            console.log(truckDriver);
                            User.findOneAndUpdate({email: data.email}, {truckDriver: true});
                        }
                        if(truckNumber == data.email){
                            console.log(truckNumber);
                            User.findOneAndUpdate({email: data.email}, {truckNumber: truckNumber});
                        }
                        if(admin == data.email){
                            console.log(admin);
                            User.findOneAndUpdate({email: data.email}, {admin: true});
                        }
                        if(customer == data.email){
                            console.log(customer);
                            User.findOneAndUpdate({email: data.email}, {customer: true});
                        }
                        if(loadPlanning == data.email){
                            console.log(loadPlanning);
                            User.findOneAndUpdate({email: data.email}, {loadPlanning: true});
                        }
                    });
                }
            }
        })
        req.flash('success_msg', 'Your accounts have been processed!');
        res.redirect('/admin');
    }
    catch (e){
        res.send('error_msg');
        console.log(e);
    };
});

console.log 将输出用户的电子邮件,但不会更新用户帐户。我可能做错了什么?提前谢谢你,我对此感到非常困惑

标签: expressmongoose

解决方案


我可以看到您的代码存在一些问题。data您从回调函数中获得的变量和datainadminArray.forEach(function (data)是两个不同的值。第一个应该是您分配给的数组,adminArray第二个是您尝试访问该email属性的对象。这可能是您遇到问题的原因。

因此,该行将User.findOneAndUpdate({email: data.email}, {truckDriver: true});不起作用,因为有可能email未定义 的值,在这种情况下,findOneAndUpdate将使用 调用{ email: undefined }

顺便说一句,因为您正在处理回调函数,所以不需要await此行上的 。await User.find({ isVerified: true }, function (err, data) {...});

我已经稍微重构了你的代码,见下文:

router.post('/admin', ensureAuthenticated, async (req, res) => {
  try {
    const { truckDriver, truckNumber, admin, customer, loadPlanning } = req.body;

    const adminArray = await User.find({ isVerified: true });
    if (!adminArray) {
      return;
    }

    for (var key in req.body) {
      if (req.body.hasOwnProperty(key)) {
        adminArray.forEach(function (data) {
          if (truckDriver == data.email) {
            console.log(truckDriver);
            User.findOneAndUpdate({ email: data.email }, { truckDriver: true });
          }
          if (truckNumber == data.email) {
            console.log(truckNumber);
            User.findOneAndUpdate({ email: data.email }, { truckNumber: truckNumber });
          }
          if (admin == data.email) {
            console.log(admin);
            User.findOneAndUpdate({ email: data.email }, { admin: true });
          }
          if (customer == data.email) {
            console.log(customer);
            User.findOneAndUpdate({ email: data.email }, { customer: true });
          }
          if (loadPlanning == data.email) {
            console.log(loadPlanning);
            User.findOneAndUpdate({ email: data.email }, { loadPlanning: true });
          }
        });
      }
    }
    req.flash('success_msg', 'Your accounts have been processed!');
    res.redirect('/admin');
  }
  catch (e) {
    res.send('error_msg');
    console.log(e);
  };
});

让我知道这是否有效,如果您看到错误也让我知道错误。干杯。


推荐阅读