Mongoose的insertMany().exec()返回TypeError错误

8
以下函数由async/await函数调用,因此我需要从Mongoose返回一个真正的Promise,因此使用了".exec()",根据文档这个SO线程
// where data is an array of documents
function insertNewResults(data) {
    return Model.insertMany(data).exec();
}

执行操作后,我遇到了以下错误:

TypeError: Model.insertMany(...).exec is not a function at insertNewResults

如果我移除exec(),那么我就可以无问题地执行insertMany。使用exec()的其他查询似乎没有出现任何错误,这使得整个过程更加困惑。请问有人能够解释为什么会出现这种情况吗? 编辑1:以下是我的模式代码。
const mongoose = require('mongoose');

const schema = new mongoose.Schema({
    date: { type: Date, required: true },
    price: { type: Number, required: true },
    result: { type: String, required: true }
}, { usePushEach: true });

schema.index(
    { date: -1 }
);
mongoose.model('Model', schema);

1
你能发布你的模式代码吗? - Ashh
@AnthonyWinzlet刚刚通过添加模式代码编辑了我的帖子。 - ptk
1个回答

14

如参考资料所述,exec()可能需要用于返回查询的方法,因为查询不是承诺。参考资料还列出了返回查询的方法

Model.deleteMany()
Model.deleteOne()
Model.find()
Model.findById()
Model.findByIdAndDelete()
Model.findByIdAndRemove()
Model.findByIdAndUpdate()
Model.findOne()
Model.findOneAndDelete()
Model.findOneAndRemove()
Model.findOneAndUpdate()
Model.replaceOne()
Model.updateMany()
Model.updateOne()

insertMany不是同步方法之一,它会立即返回一个Promise

正确应该是:

function insertNewResults(data) {
    return Model.insertMany(data);
}

感谢您清晰的解释。您是否知道为什么有些Mongoose查询返回Promise,而其他查询返回Query?对我来说,这种不一致似乎有点奇怪。 - ptk
1
当有查询操作时(读取、更新、删除操作),它们返回查询结果;当没有查询操作时(创建操作),它们会返回 Promise。根据你使用的结果,你可以直接返回查询并不需要执行 exec。 - Estus Flask

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接