Mongoose 的默认 Promise 库在 MEAN 堆栈中已弃用

Posted

技术标签:

【中文标题】Mongoose 的默认 Promise 库在 MEAN 堆栈中已弃用【英文标题】:Mongoose's default promise library is deprecated in MEAN stack 【发布时间】:2017-01-06 20:36:10 【问题描述】:

我正在尝试启动 MEAN-stack 服务器,但收到此错误消息:

Mongoose:不推荐使用 mpromise(mongoose 的默认承诺库),改为插入您自己的承诺库:http://mongoosejs.com/docs/promises.html

我试图在这里搜索一些答案,但我发现的答案对我来说不够清楚:

(node:3341) DeprecationWarning: Mongoose: mpromise

我找到了调用 mongoose.connect 的文件,但该问题的代码对我不起作用,谁能解释一下它是如何工作的?

【问题讨论】:

您尝试了哪些方法,哪些方法没有奏效? 我只是跟着Mongodb教程和MEAN-stack教程,但是服务器没有sarts。当我尝试访问 //localhost:3000/ 这个错误显示在我的终端中,并且服务器永远不会启动。 此消息不是错误,只是警告。所以问题可能出在其他地方。 那我怎样才能找到它呢?因为它是终端向我显示的唯一消息?只是按照教程,它不起作用。 KARTHIKEYAN.A 对您的问题有正确的答案。它将抑制您看到的警告。如果你想使用像 bluebird 或 q 这样的外部 Promise 库,你可以关注 Wuriyanto。这取决于您对使用已弃用的代码/方法的关心程度。 @Joao Luiz Magalhaes 如果其他方法不起作用,您应该发布一个 sn-p 代码。 【参考方案1】:

在mongo连接之前使用这个代码,这将解决promise问题。

mongoose.Promise = global.Promise;

【讨论】:

【参考方案2】:

我通常连接到 MongoDB 的方式是使用 Bluebird promise 库。您可以在this post 中阅读有关它的更多信息。运气好的话,下面的这个 sn-p 将帮助您入门,因为它是我在原型设计时使用的。

let mongoose = require('mongoose');
let promise = require('bluebird');
let uri = 'mongodb://localhost:27017/your_db';
mongoose.Promise = promise;
let connection = mongoose.createConnection(uri);

【讨论】:

详细说明你将如何实现它并不是一个坏主意。【参考方案3】:

最新的 mongoose 库,不要使用任何默认的 Promise 库。从 Mongoose v 4.1.0 开始,您可以插入自己的库。

如果您使用的是 mongoose 库(不是底层 MongoDB 驱动程序),那么您可以像这样插入 Promise 库:

//using Native Promise (Available in ES6)
mongoose.Promise = global.Promise;

//Or any other promise library
mongoose.Promise = require('bluebird');

//Now create query Promise
var query = someModel.find(queryObject);
var promise = query.exec();

如果您使用的是 MongoDB 驱动程序,那么您需要做一些额外的工作。因为,mongoose.Promise 设置了猫鼬使用的 Promise 而不是驱动程序。在这种情况下,您可以使用以下代码。

// Use bluebird
var options =  promiseLibrary: require('bluebird') ;
var db = mongoose.createConnection(uri, options);

【讨论】:

谢谢 Tolsee,我前段时间就提出了这个问题,因为他们,我不必和 mongo 一起工作,下周我将开始一个关于 Mongo 的新课程,所以如果我遇到这个麻烦再次,我会检查你的答案。【参考方案4】:

为我工作。

Mongoose v4.11.7 解决promise问题

const mongoose = require('mongoose');
mongoose.Promise = global.Promise;
mongoose.connection.openUri('mongodb://127.0.0.1:27017/app_db',  /* options */ );

猫鼬#save()

var article = new Article(Obj);
article.save().then(function(result) 
    return res.status(201).json(
        message: 'Saved message',
        obj: result
    );
, function (err) 
    if (err) 
        return res.status(500).json(
            title: 'Ac error occurred',
            error: err
        );
    
);

【讨论】:

以上是关于Mongoose 的默认 Promise 库在 MEAN 堆栈中已弃用的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose:用 promise 编写自己的方法

Mongoose:使用 Promise 作为其他函数的参数

在 Mongoose 路由中使用 Promise

Mongoose Promise 的异步性

Mongoose 对 promise 拒绝处理

mongoose所有的API都支持promise