zoukankan      html  css  js  c++  java
  • 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 () { //最终执行代码 })
    查资料不过是偏门,撸源码才是脱离苦海的正道。
  • 相关阅读:
    jquery开发之第一个程序
    结构体大小求值
    SpringMVC 理论与有用技术(一) 简单、有用、易懂的几个实例
    北极的夜空
    Assignment (HDU 2853 最大权匹配KM)
    让linux history命令显示命令的运行时间、在哪个机器运行的这个命令
    [0day]基础工具学习
    Matlab adaptive quadrature
    计蒜之道 初赛 第三场 题解 Manacher o(n)求最长公共回文串 线段树
    辛星跟您解析在CSS面包屑中三角形的定位问题
  • 原文地址:https://www.cnblogs.com/jarvisjin/p/6292694.html
Copyright © 2011-2022 走看看