首页 > 解决方案 > 无法并行多次保存()同一个文档,并且操作“users.insertOne()”缓冲在 10000 毫秒后超时

问题描述

这是我的路由器代码:

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>

这是我发送到 mongo 数据库的数据:

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

我安慰了数据并发送了数据,但未保存用户。

我已经尝试了 stackoverflow 上可用的大多数解决方案,但在我的情况下没有任何效果。请尝试帮助我。

标签: javascriptnode.jsmongodb

解决方案


您目前正在混合异步和回调。尝试更新 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);
       }
    
});

希望这会有所帮助!


推荐阅读