2016-07-19 2 views
4

Я разрабатываю приложение с nodejs/typescript и базу данных mongodb. Чтобы запросить базу данных, я использую mongoose.Mongoose Promise с bluebird и машинописным текстом

Я только что прочитал статью из документации мангустов на 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>, и я хотел бы вернуть Bluebird Promise<MyModel>, потому что я знаю, что это Блюбердо обещание.

Есть ли способ изменить/расширить/переопределить возвращаемый тип запроса мангуста? Должен ли я написать файл пользовательского определения для моего приложения? Любые другие предложения будут оценены.

Спасибо!

ответ

0

Команда mongoose обновила файл определения, и теперь вы можете подключиться и использовать свою собственную библиотеку обещаний, назначив MongoosePromise<T>.

Создайте основной .d.ts файл для вашего приложения и добавить:

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

Ссылка этот файл в проекте и теперь Mongoose возвращает Bluebird Promise!

Это также работает для других обещает библиотеку.

EDIT последние типизации версия

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

См документации here

+0

, где вы получили типизацию для мангуста? Файл [.d.ts] (https://github.com/louy/typed-mongoose), установленный с помощью 'typings install 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/q первый. tsc версия> = 2.0.
    • затем добавить (<any>mongoose).Promise = Q.Promise;
  2. используя bluebird LIB, добавьте код ниже.
    • import Bluebird = require("bluebird");
    • (<any>mongoose).Promise = Bluebird;
+0

Хорошо интересный ответ. Я попробую ;-) – Thomas

+0

Это прекрасно работало для меня, спасибо! После подключения библиотеки Q, как вы предложили, я теперь могу использовать обещания .then() .catch() и .done(), как и ожидалось. Я считаю, что стоит отметить, что, согласно Mongoose docs, «Если вам нужно полное обещание, используйте функцию .exec()». – luvaas

+0

Это официальная ссылка: https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/mongoose#promises – Joseph238

0

В этой записи, there is an open issue в файле типизации, который установлен, если вы используете typings install mongoose установить типизации. Specificical 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)

Смежные вопросы