【问题标题】:Using `lean` on mongoose queries that return arrays in TypeScript在 TypeScript 中返回数组的猫鼬查询上使用“精益”
【发布时间】:2017-12-26 13:33:10
【问题描述】:

我有两个 Mongoose 查询,并决定最好对它们使用 .lean()

对于返回单个文档的,它似乎工作正常:

let something:Something;
SomethingDocument.findOne({_id:theId}).lean().then( (res) => { something = res;});

问题是当我尝试将它与返回多个结果的查询一起使用时:

let somethings:Something[];
SomethingDocument.find({color:'blue'}).lean().then( (res) => { somethings = res;});

第二次调用报错:

Type 'Object' is not assignable to type 'Something[]'.
  The 'Object' type is assignable to very few other types. Did you mean to use the 'any' type instead?
    Property 'length' is missing in type 'Object'.

如果我尝试进行类型转换,它只会抱怨“对象”类型中缺少“长度”属性。

当我期望结果数组时,如何使用lean

...请注意,如果我简单地省略 lean ,一切都会奏效。

【问题讨论】:

    标签: node.js mongodb typescript mongoose


    【解决方案1】:

    恕我直言,Mongoose 类型定义不太好,因此您可以使用以下方法修复它:

    let somethings:Something[];
    SomethingDocument.find({color:'blue'}).lean().then((res) => { somethings = res as any;});
    

    顺便说一句,如果可以的话,我建议使用await(你必须将 TS 编译为现代 Ecma 版本):

    const somethings = await SomethingDocument.find({color:'blue'}).lean() as Something[];
    

    请注意,前一个版本在 .catch 上捕获错误,但第二个版本会抛出异常。

    【讨论】:

    • 你知道,我实际上是在那种情况下使用 await 但不想使问题复杂化。实际上,我发现在返回的 promise 数组上使用 Promise.all 更容易 - 与 Promise.all 相比,您更喜欢 await 的特定内容吗?我想您必须管理一系列承诺,但还有其他原因吗?可读性?正如我所说,我并不反对它——我正在使用它——但我还没有下定决心。
    • Await 在您的代码中引入了语法更改。这是一个新的整体讨论的主题,因此您应该更好地研究它的用法和使用它的含义。我指出它是因为阅读起来更清晰、更短。您也可以使用awaitPromise.all btw 的结果。
    猜你喜欢
    • 1970-01-01
    • 2013-08-24
    • 2019-07-04
    • 2016-03-29
    • 2022-11-22
    • 1970-01-01
    • 2018-03-07
    • 2014-05-12
    • 1970-01-01
    相关资源
    最近更新 更多