最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - MongooseError: Query was already executed: - Stack Overflow

programmeradmin0浏览0评论

I'm trying to update the document but the error says the query has already been executed.

MongooseError: Query was already executed: 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' });
  }
});

I'm trying to update the document but the error says the query has already been executed.

MongooseError: Query was already executed: 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' });
  }
});

where am I going wrong?

Share Improve this question asked Jan 10, 2022 at 15:00 Srinil KhandwalaSrinil Khandwala 2321 gold badge3 silver badges9 bronze badges
Add a ment  | 

2 Answers 2

Reset to default 11

You are using both async/await and callbacks in your code, causing mongoose to throw an error. The actual effect of using them both is exactly the error type that you are receiving:

Query was already executed

Mongoose v6 does not allow duplicate queries.

Mongoose no longer allows executing the same query object twice. If you do, you'll get a Query was already executed error. Executing the same query instance twice is typically indicative of mixing callbacks and promises, but if you need to execute the same query twice, you can call Query#clone() to clone the query and re-execute it. See gh-7398

Duplicate Query Execution

To fix the issue, just remove the third argument from the await

NewSlotModel.updateOne

Making it:

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

Mongoose v6. Don't support callbacks any longer.. check the image.

const productCount = await Product.countDocuments((count) => count)  BAD

const productCount = await Product.countDocuments(); GOOD

发布评论

评论列表(0)

  1. 暂无评论