【问题标题】:Mongoose insertMany().exec() returning a TypeErrorMongoose insertMany().exec() 返回 TypeError
【发布时间】:2018-12-29 10:37:34
【问题描述】:

以下函数由 async/await 函数调用,因此我需要从 Mongoose 返回一个真正的 Promise,因此根据 documentationthis SO thread 使用“.exec()”。

// where data is an array of documents
function insertNewResults(data) {
    return Model.insertMany(data).exec();
}

这样做会给我以下错误:

TypeError: Model.insertMany(...).exec 不是函数 在插入新结果

如果我删除 exec(),我可以毫无问题地插入许多。我使用 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);

【问题讨论】:

  • 你能发布你的 schma 代码
  • @AnthonyWinzlet 刚刚通过添加架构代码编辑了我的帖子

标签: node.js database mongodb asynchronous mongoose


【解决方案1】:

正如参考中所述,返回查询的方法可能需要exec(),因为queries are not promises。参考文献还列出了methods that return queries

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 不是其中之一,it returns a promise right away

应该是:

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

【讨论】:

  • 感谢您的明确解释。你会不会碰巧知道为什么有些 Mongoose 查询返回 Promise 而另一些返回查询?这种不一致的存在对我来说似乎有点奇怪
  • 当有东西要查询时返回查询(读取、更新、删除操作),当没有东西要查询时返回承诺(创建操作)。根据您使用结果的方式,您可能会立即返回查询,而无需使用 exec。
猜你喜欢
  • 2016-07-02
  • 1970-01-01
  • 2021-01-09
  • 2021-12-10
  • 2017-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多