首页 > 解决方案 > MongooseError:查询已执行

问题描述

我将 Mongoose 更新到最新版本(6.0.1),现在每当执行时我都会收到此错误.findOne()

MongooseError: Query was already executed: Streams.findOne({ i: 6 })
    at model.Query._wrappedThunk [as _findOne] (C:\Users\honza\ZiggerTestMaster\node_modules\mongoose\lib\helpers\query\wrapThunk.js:21:19)
    at C:\Users\honza\ZiggerTestMaster\node_modules\kareem\index.js:370:33
    at processTicksAndRejections (node:internal/process/task_queues:78:11)
    at runNextTicks (node:internal/process/task_queues:65:3)
    at listOnTimeout (node:internal/timers:526:9)
    at processTimers (node:internal/timers:500:7) {
  originalStack: 'Error\n' +
    '    at model.Query._wrappedThunk [as _findOne] (C:\\Users\\honza\\ZiggerTestMaster\\node_modules\\mongoose\\lib\\helpers\\query\\wrapThunk.js:25:28)\n' +
    '    at C:\\Users\\honza\\ZiggerTestMaster\\node_modules\\kareem\\index.js:370:33\n' +
    '    at processTicksAndRejections (node:internal/process/task_queues:78:11)\n' +
    '    at runNextTicks (node:internal/process/task_queues:65:3)\n' +
    '    at listOnTimeout (node:internal/timers:526:9)\n' +
    '    at processTimers (node:internal/timers:500:7)'
}

我的代码如下:

var visitorData = Visitor.find({});
    
app.get("/retrieve", function(req,res){
    visitorData.exec(function (err,data) {
        if (err) {
            throw err;
        }
        res.render("retrieve", { title:"View Visitor Data", records: data});
     });
});

它在我第一次打开路由时正确执行,但是每当我刷新它时,它都会引发上述错误。自 Mongoose 获得最新版本以来一直在发生。

标签: node.jsmongoose

解决方案


有同样的问题,但是关于 mongoose 的发行说明有所帮助,我将一个.clone()方法链接到该.find()方法:

https://mongoosejs.com/docs/migrating_to_6.html#duplicate-query-execution

Mongoose 不再允许执行相同的查询对象两次。如果你这样做了,你会得到一个 Query is already executed 错误。执行两次相同的查询实例通常表示混合了回调和承诺,但如果您需要执行两次相同的查询,您可以调用 Query#clone() 来克隆查询并重新执行它。

因此,您需要做的就是在.clone()需要同时调用的 mongoose 方法的末尾添加一个方法,如下所示(我对您的代码进行了一些重组):

app.get("/retrieve", function (req, res) {
    Visitor.find({}, function (err, data) {
        if (!err) {
            res.render("retrieve", { title: "View Visitor Data", records: data });
        } else {
            throw err;
        }
    }).clone().catch(function(err){ console.log(err)})
});

推荐阅读