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结合使用实例的更多相关文章

  1. nodejs+mongoose操作mongodb副本集实例

    继上一篇设置mongodb副本集之后,开始使用nodejs访问mongodb副本集: 1:创建项目     express 项目名称 2:npm install mongoose    安装mongo ...

  2. mongoose多条件模糊查询实例

    mongoose多条件模糊查询 这是今天手头项目中遇到的一个问题,关于mongoose如何实现类似于SQL中 nick LIKE '%keyword%' or email LIKE '%keyword ...

  3. Mongoose 框架初学使用记录

    嘛.... 最近由于需要使用HTTP服务端,原先是使用的Qt框架实现的HTTP服务端,然后发现有些缺陷导致我不得不放弃这个框架,也不是完全放弃,只是HTTP服务端这里不再使用Qt,用Qt做高并发真的有 ...

  4. node 通过mongoose实现 mongodb的增删改

    node 通过mongoose实现 mongodb的增删改   新建文件test.js 内容如下:   var mongoose = require('mongoose') , Schema = mo ...

  5. mongoose简单使用样例

    新建文件 app.js 内容如下: var mongoose = require('mongoose') , Schema = mongoose.Schema; mongoose.connect('m ...

  6. [转] mongoose学习笔记(超详细)

    名词解释 Schema: 一种以文件形式存储的数据库模型骨架,不具备数据库的操作能力 Model: 由Schema编译而成的假想(fancy)构造器,具有抽象属性和行为.Model的每一个实例(ins ...

  7. [转] Mongoose简要API

    Mongoose是在node.js环境下对mongodb进行便捷操作的对象模型工具 因此,要使用mongoose,则必须安装node.js环境以及mongodb数据库.mongoose使mongodb ...

  8. Mongoose 利用实现HTTP服务

    嘛.... 注意:这里是使用mongoose实现HTTP服务,非数据库使用. 最近由于需要使用HTTP服务端,原先是使用的Qt框架实现的HTTP服务端,然后发现有些缺陷导致我不得不放弃这个框架,也不是 ...

  9. 进击Node.js基础(二)

    一.一个牛逼闪闪的知识点Promise npm install bluebird 二.Promise实例 ball.html <!doctype> <!DOCTYPE html> ...

随机推荐

  1. 深入理解viewport(转)

    在移动设备上进行网页的重构或开发,首先得搞明白的就是移动设备上的viewport了,只有明白了viewport的概念以及弄清楚了跟viewport有关的meta标签的使用,才能更好地让我们的网页适配或 ...

  2. 转载--使用image-set来优化在retian屏幕下的背景图片

    mage-set对我来说,我也很陌生,于是借助G爸和度娘海量的搜索image-set,才知道Webkit内核"safari6"和“chrome21”支持CSS4的backgroun ...

  3. ntpdate

    apt-get install ntpdate ntpdate 133.100.9.2 [root@10.10.10.74 /data]$ lsof -i:123 COMMAND PID USER F ...

  4. 配置jboss4.2.3GA启用SSL

    转帖保存 配置jboss的HTTP请求走SSL(HTTPS协议) l         生成keystore 文件 用keytool生成server.keystore文件: 进入命令行 C:\Docum ...

  5. swfobject.embedSWF属性与用法

    JS+flash的焦点幻灯片既能大方得体的展示焦点信息,也能美轮美奂的展示图片,越来越多的网站使用这种焦点幻灯的表现方法.很多童鞋在下载这方面的素材代码的时候,往往会因为展示出来的是flash,觉得难 ...

  6. Android学习笔记之Intent(2)

    打开网页 package com.jiahemeikang.helloandroid; import java.io.File; import com.jiahemikang.service.Echo ...

  7. USACO刷题之路

    重拾经典 本科生涯结束了,在大学做的ACM竞赛现在基本忘的差不多了.USACO作为一个经典的题库,本来是面向OI选手的,但是由于题目质量很高所以受到大家的好评,所以我这次就从它开始我的刷题之路吧. 由 ...

  8. ubuntu中mysql修改编码utf8

    摘要:Ubuntu Server 服务器下使用apt-get 命令安装的mysql,默认不是utf8.在这里记录一下如何将编码修改成utf8. 办法解决: 1.查看mysql编码 show varia ...

  9. C# 开发系列(三)

    参考:http://stackoverflow.com/questions/11248935/passing-values-to-a-put-json-request-in-c-sharp 发送htt ...

  10. 下标脚本(Swift)

    下标脚本 可以定义在类(Class).结构体(structure)和枚举(enumeration)这些目标中,可以认为是访问集合(collection),列表(list)或序列(sequence的快捷 ...