【问题标题】:Mongoose Promise with bluebird and typescript猫鼬承诺与蓝鸟和打字稿
【发布时间】:2016-11-21 19:47:44
【问题描述】:

我正在使用 nodejs/typescript 和 mongodb 数据库开发应用程序。 查询数据库,我使用mongoose

我刚刚在how to plug in an external promise library 上阅读了mongoose 文档中的一篇文章,非常简单:

import mongoose = require("mongoose");
import Promise = require("bluebird");
mongoose.Promise = Promise;

这样做效果很好。但我想扩展/覆盖返回的承诺类型。

这是一个函数的例子:

public getModel= () => {
    return MyModel.findOne().exec();
}

这个函数返回一个_mongoose.Promise<MyModel>,我想返回一个蓝鸟Promise<MyModel>,因为我知道这是一个蓝鸟承诺。

有没有办法改变/扩展/覆盖猫鼬查询的返回类型? 我应该为我的应用程序编写自定义定义文件吗?任何其他建议将不胜感激。

谢谢!

【问题讨论】:

    标签: node.js mongodb typescript mongoose


    【解决方案1】:

    我应该为我的应用编写自定义定义文件

    是的。它主要是在 mongoose 定义中查找和替换 Promise。

    【讨论】:

    • 感谢您的回答。我没有找到任何关于如何编写自定义定义文件并将其集成到 nodejs 应用程序中的好的文档。您的书中是否有任何文档可以作为起点?
    【解决方案2】:

    mongoose 团队更新了定义文件,您现在可以通过分配 MongoosePromise<T> 来插入和使用自己的 Promise 库。

    为您的应用程序创建一个主 .d.ts 文件并添加以下内容:

    declare module "mongoose" {
        import Bluebird = require("bluebird");
        type MongoosePromise<T> = Bluebird<T>;
    }
    

    在你的项目中引用这个文件,现在 Mongoose 返回 Bluebird Promise !

    这也适用于其他承诺库。

    编辑最新的打字版本

    declare module "mongoose" {
        import Bluebird = require("bluebird");
        type Promise<T> = Bluebird<T>;
    }
    

    参见文档here

    【讨论】:

    【解决方案3】:

    Promise在mongoose中导出为变量,所以可以先将mongoose命名空间转换为any,再将Promise设置为其他。

    1. 如果您使用的是q lib。
      • 首先安装npm install --save q @types/qtsc 版本 >= 2.0。
      • 然后添加(&lt;any&gt;mongoose).Promise = Q.Promise;
    2. 使用bluebird lib,在下面添加代码。
      • import Bluebird = require("bluebird");
      • (&lt;any&gt;mongoose).Promise = Bluebird;

    【讨论】:

    • 好的,有趣的答案我会试一试;-)
    • 这对我来说效果很好,谢谢!按照您的建议插入 Q 库后,我现在可以按预期使用 promises .then() .catch() 和 .done() 。我认为值得注意的是,根据 Mongoose 文档,“如果您需要一个成熟的承诺,请使用 .exec() 函数。”
    【解决方案4】:

    在撰写本文时,如果您使用 typings install mongoose 安装类型,则安装的类型文件中的there is an open issue。特别是typings file that is loaded 导入mpromise,并且该导入语句导致通过键入包含完整的mpromise module definition 文件并包含在您的typings\modules\mongoose\index.d.ts 文件中。

    在此问题得到解决之前,我的解决方法是删除 ~mongoose~mpromise 的模块定义并替换 index.d.ts 文件中的以下行:

    import * as Promise from '~mongoose~mpromise';
    

    用这个:

    import Promise = require( "bluebird");
    

    这无疑是一个临时的权宜之计,因为再次调用 typings install mongoose 将恢复此修复。出于好奇,我目前的设置包括:typings(2.0.0 版)、npm(3.10.9)和节点(v6.9.2)

    【讨论】:

      猜你喜欢
      • 2015-10-27
      • 2015-11-19
      • 2016-09-23
      • 2016-06-04
      • 1970-01-01
      • 2016-06-10
      • 2015-03-05
      • 2015-03-06
      • 2016-05-25
      相关资源
      最近更新 更多