Обновить базу данных в цикле foreach - PullRequest
0 голосов
/ 24 февраля 2020

Когда я запускаю этот код

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 выводит электронную почту пользователя, но учетные записи пользователей не обновляются. Что я могу делать не так? Заранее спасибо, я очень запутался в этом

Ответы [ 2 ]

1 голос
/ 24 февраля 2020

Я вижу несколько проблем с вашим кодом. Переменная data, полученная из функции обратного вызова, и data в adminArray.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) {...}); не нужен, потому что вы имеете дело с функцией обратного вызова.

I немного изменил код, см. ниже:

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

Дайте мне знать, если это работает, в случае, если вы видите ошибку, также дайте мне знать об ошибке. Приветствия.

0 голосов
/ 25 февраля 2020

Решил, используя это

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(async (data, res) =>{
                        if(truckDriver == data.email){
                            await User.findOneAndUpdate({email: data.email}, {truckDriver: true});
                        }
                        if(truckNumber == data.email){
                            await User.findOneAndUpdate({email: data.email}, {truckNumber: truckNumber});
                        }
                        if(admin == data.email){
                            await User.findOneAndUpdate({email: data.email}, {admin: true});
                        }
                        if(customer == data.email){
                            await User.findOneAndUpdate({email: data.email}, {customer: true});
                        }
                        if(loadPlanning == data.email){
                            await 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);
    };
});

Спасибо всем за помощь <3 </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...