猫鼬承诺与蓝鸟和打字稿

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/qtsc 版本 >= 2.0。 然后添加(&lt;any&gt;mongoose).Promise = Q.Promise; 使用bluebird lib,在下面添加代码。 import Bluebird = require("bluebird"); (&lt;any&gt;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)

【讨论】:

以上是关于猫鼬承诺与蓝鸟和打字稿的主要内容,如果未能解决你的问题,请参考以下文章

无法将猫鼬虚拟与打字稿一起使用

将模糊搜索与猫鼬一起使用时出现打字稿错误

将模糊搜索与猫鼬一起使用时出现打字稿错误

使用猫鼬模型设置打字稿

使用猫鼬和打字稿创建模式

使用猫鼬和打字稿创建模式