繁体   English   中英

与蓝鸟和打字稿的猫鼬承诺

[英]Mongoose Promise with bluebird and typescript

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

我刚刚阅读了mongoose文档中有关如何插入外部promise库的文章 ,它非常简单:

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

这样做很好。 但是我想扩展/覆盖返回的promise的类型。

这是一个函数的例子:

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

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

无论如何都有改变/扩展/覆盖mongoose查询的返回类型? 我应该为我的应用编写自定义定义文件吗? 任何其他建议将不胜感激。

谢谢 !

Promise导出为mongoose中的变量,因此您可以将mongoose名称空间转换为任何名称,然后将Promise设置为其他名称空间。

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

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

是。 它主要是在猫鼬定义中找到并取代Promise。

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>;
}

请参阅此处的文档

在撰写本文时,如果您使用typings install mongoose来安装打字, 那么在打包文件中会出现一个未解决的问题 特定的打包文件,加载导入mpromise ,导入语句导致包含完整的mpromise模块定义文件的打字 ,并包含在您的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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM