Mongoose 用蓝鸟做猫鼬承诺的正确方法是什么?

Mongoose 用蓝鸟做猫鼬承诺的正确方法是什么?,mongoose,bluebird,Mongoose,Bluebird,我一直在阅读文档和文章,每个人似乎都在描述一种不同的方式来使用猫鼬和蓝知更鸟。甚至官方的猫鼬文件和蓝鸟文件也说 根据猫鼬的说法: mongoose.Promise=require('bluebird'); 根据蓝鸟的说法: var Promise=require(“蓝鸟”); 承诺。承诺(要求(“猫鼬”); 因此,据我所知,如果您选择Mongoose方式,示例查询将如下所示: User.findById('someId')) .然后(函数(){ //做事 }) .catch(函数(err){

我一直在阅读文档和文章,每个人似乎都在描述一种不同的方式来使用猫鼬和蓝知更鸟。甚至官方的猫鼬文件和蓝鸟文件也说

根据猫鼬的说法:

mongoose.Promise=require('bluebird');
根据蓝鸟的说法:

var Promise=require(“蓝鸟”);
承诺。承诺(要求(“猫鼬”);
因此,据我所知,如果您选择Mongoose方式,示例查询将如下所示:

User.findById('someId'))
.然后(函数(){
//做事
})
.catch(函数(err){
//处理错误
})
但在猫鼬文件中也有这样的说法:

猫鼬查询不是承诺。但是,它们确实有一个.then()函数用于yield和async/await。如果需要完整的承诺,请使用.exec()函数

那么在这种情况下,
。那么
是否高于承诺

如果你选择蓝鸟的方式:

User.findById('someId'))
.execAsync()
.然后(函数(){
//做事
})
.catch(函数(err){
//处理错误
})
或者甚至可以跳过
execAsync()
,改为从
findByIdAsync
开始


真的被不同的文件弄糊涂了。如果有人能解释一下,我将不胜感激。

来自蓝鸟文件

Promise.promisifyAll(
    Object target,
    [Object {
        suffix: String="Async",
        multiArgs: boolean=false,
        filter: boolean function(String name, function func, Object target, boolean passesDefaultFilter),
        promisifier: function(function originalFunction, function defaultPromisifier)
    } options] ) -> Object
如您所见,默认情况下,promisifyAll会添加后缀“Asyns”,因此,如果您使用这种promisification方式:

var Promise = require("bluebird");
Promise.promisifyAll(require("mongoose"));
User.findById
的异步版本将是
User.findByIdAsync

猫鼬怎么样?承诺

然后你可以像这样使用promise库

mongoose.Promise = require('bluebird');
内置承诺机制被库取代:
query.exec().constructor
require('bluebird')
取代,因此,对于返回承诺,您可以直接将bluebird概率用于mongoose查询,如

User.findOne({}).then(function(user){
    // ..
})  

选择猫鼬的方式:

mongoose.Promise = require('bluebird');
这是因为Mongoose已经支持承诺(除了接受回调);上面的代码只是用Bluebird替换了Mongoose自己的promise库()


Bluebird的
promisify*()
旨在允许尚未使用承诺(纯粹基于回调的函数)的代码返回承诺。

对于使用TypeScript的用户,正确的方法是:

(猫鼬)。承诺=你的承诺

从文件中:

Typescript does not allow assigning properties of imported modules. To avoid compile errors use one of the options below in your code:

(<any>mongoose).Promise = YOUR_PROMISE;

require('mongoose').Promise = YOUR_PROMISE;

import mongoose = require('mongoose'); mongoose.Promise = YOUR_PROMISE;
Typescript不允许分配导入模块的属性。要避免编译错误,请在代码中使用以下选项之一:
(猫鼬)承诺=你的承诺;
要求(“猫鼬”)。承诺=你的承诺;
导入猫鼬=需要(“猫鼬”);猫鼬承诺=你的承诺;

谢谢您的回答。我走猫鼬的路怎么样?正如我在问题中所问的那样,
。那么
在这种情况下是否是一种承诺?有没有理由选择一种方式而不是另一种?谢谢你的回答。这改进了@stasovlas的答案。mongoose可以在整个代码库中的多个位置加载和建立连接。哪些位置需要
mongoose.Promise=require('bluebird')?我相信Mongoose对象是一个单独的对象,但我很难让这个更改在一个大型项目中生效。@MarkStosberg只做一次就足够了,只要你在应用程序中尽可能“高”地做它(比如应用程序入口点文件,通常称为
app.js
server.js
或其他)。当我执行此操作时,我得到
“[ts]无法分配给'Promise',因为它是常量或只读属性。”