我正在使用nodejs / typescript和mongodb数据库开发一个应用程序。 要查询数据库,我使用的是mongoose。
我刚刚阅读了how to plug in an external promise library上的mongoose文档中的一篇文章,这很简单:
import mongoose = require("mongoose");
import Promise = require("bluebird");
mongoose.Promise = Promise;
这样做很好。但是我想扩展/覆盖返回的promise类型。
以下是一个函数示例:
public getModel= () => {
return MyModel.findOne().exec();
}
此函数返回_mongoose.Promise<MyModel>
,我想返回蓝鸟Promise<MyModel>
,因为我知道这是蓝鸟的承诺。
是否有改变/扩展/覆盖mongoose查询的返回类型? 我应该为我的应用编写自定义定义文件吗?任何其他建议将不胜感激。
谢谢!
答案 0 :(得分:5)
Promise
导出为mongoose中的变量,因此您可以先将mongoose
命名空间转换为任何名称空间,然后将Promise
设置为其他名称空间。
q
lib。
npm install --save q @types/q
。 tsc
版本&gt; = 2.0。(<any>mongoose).Promise = Q.Promise;
bluebird
lib,在下面添加代码。
import Bluebird = require("bluebird");
(<any>mongoose).Promise = Bluebird;
答案 1 :(得分:1)
我应该为我的应用编写自定义定义文件
是。它主要是在猫鼬定义中找到并取代Promise。
答案 2 :(得分:1)
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 :(得分:0)
在撰写本文时,如果您使用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)