2016-07-19 80 views
4

我正在开发一个带有nodejs/typescript和mongodb数据库的应用程序。 要查询数据库,我正在使用mongoose与蓝鸟和打字稿的猫鼬承诺

我刚读从猫鼬文档一篇关于how to plug in an external promise library,这是非常简单的:

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

这样做是工作的罚款。但是我想扩展/覆盖返回的承诺的类型。

这里是一个函数的例子:

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

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

是否有更改/扩展/重写返回类型的猫鼬查询? 我应该为我的应用程序编写自定义定义文件吗?任何其他建议,将不胜感激。

谢谢!

回答

0

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

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

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

参考该文件在您的项目,现在猫鼬返回蓝鸟的承诺!

这也适用于其他承诺库。

编辑最新分型版本

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

查看文档here

+0

你从哪里得到猫鼬的打字?通过'typings install mongoose'安装的[.d.ts文件](https://github.com/louy/typed-mongoose)没有对MongoosePromise的引用 – Jthorpe

+0

发布更新:是的我从'typings install mongoose '。我使用的是打字稿1.9,但我知道现在打字带有npm。也取决于猫鼬版本。这里是最新版本:https://github.com/DefinitelyTyped/DefinitelyTyped/blob/4869992bc079b88280b9ff91213528904109e8ae/mongoose/README.md – Thomas

1

我应该写一个自定义文件,我的应用程序

是。它主要是在猫鼬定义中找到并替换Promise。

+0

感谢您的回答。我没有找到有关如何编写自定义定义文件并将其集成到nodejs应用程序中的任何优秀文档。您的书中是否有任何文档可以用作起点? – Thomas

5

Promise出口在猫鼬的变量,所以你可以mongoose空间转换为任何第一,然后设置Promise给他人。

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

好的有趣的答案我会试试看;-) – Thomas

+0

这对我来说非常合适,谢谢!按照您的建议插入Q库之后,我现在可以按照预期使用promise .then().catch()和.done()。我相信值得注意的是,按照Mongoose的文档,“如果你需要一个完整的承诺,使用.exec()函数。” – luvaas

+0

这是官方的参考资料:https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/mongoose#promises – Joseph238

0

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

直到这个问题GET的解决,我的解决方法是删除模块定义为~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)和node(v6.9.2)