Mongoose与bluebird结合使用实例
Posted 土拉发子
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mongoose与bluebird结合使用实例相关的知识,希望对你有一定的参考价值。
nodejs的所有调用几乎是全异步的,而所有的IO操作也都是通过回调函数才能知道结果。 如果一个异步调用依赖另一个异步调用,如果没有Promise的话,有可能陷入传说中的回调地狱。
bluebird实现了将异步回调写法转变为链式写法,并且扩展出了catch、finally、bind等api,如catch可以帮我们集中处理每次查询的error。
网上找到的有关promise和bluebird的资料基本都是讲原理和理论,本文介绍的是bluebird实际使用例子。实操中,我们只用将需要使用链式的类和方法进行promisify就行,代码如下:
//引入数据库操作模块 var mongodb = require("./db") Promise = require("bluebird") ; var mongoose = require("mongoose"); var Schema = mongoose.Schema; //声明User Schema结构 var userSchema = new Schema({ user_id: String, password: {type: String, default: ""}, nickname: {type: String, default: ""}, introduction: {type: String, default: ""}, age: {type: String, default: ""}, gender: {type: String, default: ""}, }); //将User类给予接口 var User = mongoose.model(‘User‘, userSchema); //promise化user类及其方法 Promise.promisifyAll(User); Promise.promisifyAll(User.prototype); module.exports = User;
另外,下文用到的Room Schema也需要做上面的处理
使用方式如下:
Room.findOne({type:‘pano‘}) // .exec() .then(function (room) { console.log(‘rooms:‘,room)
//这里不再用回调的方式返回查询结果,而是将查询结果传递到下一个.then return User.findOne({_id:room.creator}); }) .then(function (user) { console.log(‘user接收上一个.then传递的变量:‘,user) }) .catch(function (e) { //处理error }) .finally(function () { //最终执行代码 })
以上是关于Mongoose与bluebird结合使用实例的主要内容,如果未能解决你的问题,请参考以下文章
无法得到我在 nodejs / mongoose / bluebird 中返回的承诺
Promisifying Mongoose Connect 中的类型错误
Bluebird — 在处理程序中创建了一个承诺,但没有从它返回
如何将 Schema 和 noSchema 与 Mongoose 结合使用?