Невозможно сохранить() один и тот же документ несколько раз параллельно, а время буферизации операции `users.insertOne()` истекло через 10000 мс.

avatar
its_shyam640
9 августа 2021 в 03:36
196
1
0

Это код моего маршрутизатора:

router.post('/users/register',async (req,res) => {
       console.log(req.body);
       const user = new User(req.body);
       try{
          await user.save(function(err){
             if (err) {
               console.log(err);
             }
          });
          const token = await user.generateAuthToken();
          res.redirect('/');
       }catch(e){
          console.log(e);
          res.status(400).send(e);
       }
    
});

Сгенерировать код токена:

userSchema.methods.generateAuthToken = async function() {
   const user = this;
   const token = jwt.sign({ _id : user._id.toString() },process.env.JWT_SECRET_CODE);
   user.tokens = user.tokens.concat({token}); 
   await user.save();
   return token;
}

код сохранения пользователя:

userSchema.pre('save', async function (next){
   const user = this;
   if(user.isModified('password')){
      user.password = await bcrypt.hash(user.password,8);
   }
   next();
});

Ошибка:

ParallelSaveError: Can't save() the same doc multiple times in parallel. Document: 61109ecdc48220245c0ecaf7
    at model.Model.save       
    at model.userSchema.methods.generateAuthToken 



MongooseError: Operation `users.insertOne()` buffering timed out after 10000ms
    at Timeout.<anonymous>

Это данные, которые я отправляю в базу данных монго:

{
  name: 'sdhfie',
  username: 'eifh_2397',
  email: 'example@gmail.com',
  phone: '+918329389241',
  password: 'sdfieu@92734',
  'repeat-password': 'sdfieu@92734'
}

Я украл данные, и данные отправляются, но пользователь не сохраняется.

Я перепробовал большинство решений, доступных на coderhelper, но в моем случае ничего не помогло. Пожалуйста, попробуйте мне помочь.

Источник
Alexander Staroselsky
9 августа 2021 в 03:39
0

Вы неправильно используете async/await. Вы используете как функцию обратного вызова, так и асинхронную. Выберите один или другой.

its_shyam640
9 августа 2021 в 03:50
0

@AlexanderStaroselsky, не могли бы вы уточнить подробнее.

its_shyam640
9 августа 2021 в 03:55
0

Готово, я понял. Большое спасибо!

Alexander Staroselsky
9 августа 2021 в 03:55
0

В частности, await user.save(function(err){. Вы выполняете await впереди, что вы бы сделали без передачи функции обратного вызова. Эффективно удалите функцию из save(), если хотите использовать await.

Ответы (1)

avatar
Alexander Staroselsky
9 августа 2021 в 04:08
0

В настоящее время вы смешиваете асинхронный и обратный вызов. Попробуйте обновить обработчик POST, чтобы удалить функцию обратного вызова из save():

router.post('/users/register', async (req,res) => {
       console.log(req.body);
       const user = new User(req.body);
       try {
          await user.save();
          const token = await user.generateAuthToken();
          res.redirect('/');
       } catch(e){
          console.log(e);
          res.status(400).send(e);
       }
    
});

Надеюсь, это поможет!