2016-07-19 3 views
4

私はnodejs/typescriptとmongodbデータベースを使ってアプリケーションを開発しています。 データベースに問い合わせるには、mongooseを使用しています。Mongoose Promise(ブルーバードとタイピッチ)

私はちょうど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>を返すようにしたいと思います。

mongooseクエリの戻り値の型を変更/オーバーライド/オーバーライドする方法はありますか? 私のアプリ用のカスタム定義ファイルを書くべきでしょうか?他の提案は高く評価されます。

ありがとうございます!

答えて

0

mongooseチームが定義ファイルを更新しました。これで、MongoosePromise<T>を割り当てることで、独自の約束ライブラリをプラグインして使用することができます。

アプリケーションのメイン.d.tsファイルを作成し、これを追加します。

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

リファレンスプロジェクトでこのファイルを、今マングースは、ブルーバードの約束を返します!

これは他の約束ライブラリでも機能します。

EDIT最新タイピングバージョン

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 '。私はtypescript 1.9を使用していましたが、今は入力はnpmになります。また、マングースバージョンにもよります。ここに最新のバージョンがあります:https://github.com/DefinitelyTyped/DefinitelyTyped/blob/4869992bc079b88280b9ff91213528904109e8ae/mongoose/README.md – Thomas

1

私は私のアプリ

はい用のカスタム定義ファイルを記述する必要があります。それは主に、マングース定義におけるプロミスの発見と置き換えになります。

+0

ありがとうございます。カスタム定義ファイルを作成してnodejsアプリケーションに統合する方法について、適切なドキュメントが見つかりませんでした。あなたの本に私が出発点として使用できる文書がありますか? – Thomas

5

Promise輸出マングースにおける変数として、あなたは、任意の第一としてmongoose名前空間を変換し、他の人にPromiseを設定できるようにします。

  1. q libを使用している場合は、
    • npm install --save q @types/qを先にインストールしてください。 tscバージョン2.0以上。
    • はその後、bluebirdのlibを使用して(<any>mongoose).Promise = Q.Promise;
  2. を追加するには、以下のコードを追加します。 これを書いているよう
    • import Bluebird = require("bluebird");
    • (<any>mongoose).Promise = Bluebird;
+0

おかしい面白い答え私は試してみましょう;-) – Thomas

+0

これは私のために美しく働いた、ありがとう!あなたが提案したようにQライブラリをプラグインした後で、今度は約束通りに.then().catch()と.done()を使用できるようになりました。 Mongooseの文書によれば、 "本格的な約束が必要な場合は、.exec()関数を使用してください。" – luvaas

+0

これは公式参照です:https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/mongoose#promises – Joseph238

0

、あなたがタイピングをインストールするtypings install mongooseを使用する場合、インストールされているタイピングファイルでthere is an open issue。 Specificaly typings file that is loadedmpromiseをインポートし、そのインポートステートメントの結果、完全なmpromise module definitionファイルが入力され、typings\modules\mongoose\index.d.tsファイルに含まれます。

この問題がのが解決得るまで、私の回避策は~mongoose~mpromiseためのモジュール定義を削除し、index.d.tsファイルに次の行を交換することである。この1と

import * as Promise from '~mongoose~mpromise'; 

import Promise = require("bluebird"); 

これは、間違いなくtypings install mongooseへの別の呼び出しがこの修正を元に戻すと一時的なストップギャップが発生します。私の現在のセットアップには、入力(バージョン2.0.0)、npm(3.10.9)、ノード(v6.9.2)が含まれます。