猫鼬承诺与蓝鸟和打字稿
Posted
技术标签:
【中文标题】猫鼬承诺与蓝鸟和打字稿【英文标题】: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>
,因为我知道这是一个蓝鸟承诺。
有没有办法改变/扩展/覆盖猫鼬查询的返回类型? 我应该为我的应用程序编写自定义定义文件吗?任何其他建议将不胜感激。
谢谢!
【问题讨论】:
【参考方案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
【讨论】:
你从哪里得到猫鼬的类型?通过typings install mongoose
安装的.d.ts file 没有引用MongoosePromise
更新后:是的,我从typings install mongoose
得到了打字。我使用的是 typescript 1.9,但我现在知道类型是 npm 附带的。也取决于猫鼬版本。这是最新版本:github.com/DefinitelyTyped/DefinitelyTyped/blob/…
呃,我直接去代码找到了这个:github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/… 下次我必须阅读文档:\【参考方案3】:
Promise
在mongoose中导出为变量,所以可以先将mongoose
命名空间转换为any,再将Promise
设置为其他。
-
如果您使用的是
q
lib。
首先安装npm install --save q @types/q
。 tsc
版本 >= 2.0。
然后添加(<any>mongoose).Promise = Q.Promise;
使用bluebird
lib,在下面添加代码。
import Bluebird = require("bluebird");
(<any>mongoose).Promise = Bluebird;
【讨论】:
好的,有趣的答案我会试一试;-) 这对我来说效果很好,谢谢!按照您的建议插入 Q 库后,我现在可以按预期使用 promises .then() .catch() 和 .done() 。我认为值得注意的是,根据 Mongoose 文档,“如果您需要一个成熟的承诺,请使用 .exec() 函数。” 这是官方参考:github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/…【参考方案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)
【讨论】:
以上是关于猫鼬承诺与蓝鸟和打字稿的主要内容,如果未能解决你的问题,请参考以下文章