MongooseError:查询已执行:

Sri*_*ala 2 javascript mongoose mongodb express mongodb-query

我正在尝试更新文档,但错误表明查询已被执行。

MongooseError:查询已执行:footballs.updateOne({ date: 'January 4' }, {})

app.post('/api/bookslot', async (req, res) => {
  console.log(req.body);
  try {
    const token = req.headers['x-access-token'];
    const decoded = jwt.verify(token, 'secret123');
    const email = decoded.email;
    const user = await UserModel.findOne({ email: email });

    let sportname = req.body.selectedSport.toLowerCase();
    const time = req.body.slotTime;
    const seats = req.body.availableSeats - 1;

    if (!sportname.endsWith('s')) {
      sportname = sportname.concat('s');
    }
    const NewSlotModel = mongoose.model(sportname, slotSchema);
    var update = {};
    update[time] = seats - 1;
    console.log(update);
    const a = await NewSlotModel.updateOne(
      { date: req.body.slotDate },
      { $set: update },
      function (err, success) {
        if (err) return handleError(err);
      }
    );

    return res.json({ status: 'ok' });
  } catch (e) {
    console.log(e);
    res.json({ status: 'error' });
  }
});
Run Code Online (Sandbox Code Playgroud)

我哪里出错了?

小智 10

您在代码中同时使用了 async/await 和回调,导致 mongoose 抛出错误。使用它们的实际效果正是您收到的错误类型:

查询已经执行

Mongoose v6 不允许重复查询。

Mongoose 不再允许执行同一查询对象两次。如果这样做,您将收到“查询已执行”错误。执行相同的查询实例两次通常表示混合回调和承诺,但如果您需要执行相同的查询两次,您可以调用 Query#clone() 来克隆查询并重新执行它。参见 gh-7398

重复查询执行

要解决此问题,只需从等待中删除第三个参数即可

NewSlotModel.updateOne

进行中:

const a = await NewSlotModel.updateOne(
  { date: req.body.slotDate },
  { $set: update }
);
Run Code Online (Sandbox Code Playgroud)