2015-09-26 72 views
1

我有一个用户模型是这样的:节点JS:青鸟Promisify在猫鼬中间件

var Promise = require("bluebird") 
var mongoose = require("mongoose"); 
var mongooseAlias = require('mongoose-aliasfield'); 
var bcrypt = Promise.promisifyAll(require('bcrypt-nodejs')); 

var Schema = mongoose.Schema; 

var userSchema = new Schema({ 
    u: { type: String, required: true, trim: true, index: { unique: true }, 'alias': 'userId' }, 
    fb: { type: String, required: true, 'alias': 'fbAccessToken' }, 
    ap: { type: String, required: true, 'alias': 'apiAccessToken' }, 
    f: { type: String, required: true, 'alias': 'firstName' }, 
    l: { type: String, required: true, 'alias': 'lastName' }, 
    e: { type: String, required: true, 'alias': 'email' } 
}); 

// Execute before each user.save() call 
userSchema.pre('save', function(callback) { 
    var user = this; 

    // return if token hasn't changed 
    if (!user.isModified('fb') && !user.isModified('ap')) 
     return callback(); 

    // token changed so we need to hash it 
    bcrypt.genSalt(5, function(err, salt) { 
     if (err) return callback(err); 
     bcrypt.hash(user.fb, salt, null, function(err, hash) { 
      if (err) return callback(err); 
      user.fb = hash; 
      bcrypt.genSalt(5, function(err, salt) { 
       if (err) return callback(err); 
       bcrypt.hash(user.ap, salt, null, function(err, hash) { 
        if (err) return callback(err); 
        user.ap = hash; 
        callback(); 
       }); 
      }); 
     }); 
    }); 
}); 

userSchema.plugin(mongooseAlias); 

module.exports = mongoose.model('User', userSchema); 

我努力学习蓝鸟的时刻,所以我清理了bcrypt这样的代码:

userSchema.pre('save', function(callback) { 
    var user = this; 
    // return if token hasn't changed 
    if (!user.isModified('fb') && !user.isModified('ap')) 
     return callback(); 

    var p1 = bcrypt.genSaltAsync(5).then(function (salt) { 
     return bcrypt.hash(user.fb, salt, null); 
    }).then(function (hash) { 
     user.fb = hash; 
    }); 
    var p2 = bcrypt.genSaltAsync(5).then(function (salt) { 
     return bcrypt.hash(user.ap, salt, null); 
    }).then(function (hash) { 
     user.ap = hash; 
    }); 

    Promise.all(p1, p2).then(function() { 
     callback(); 
    }).catch(function (err) { 
     callback(err); 
    }); 
}); 

我可以“进一步promisify”吗?或者说,我在这里错过了什么可以让它更优雅的东西?我需要以某种方式promisify userSchema.pre电话吗?

干杯

回答

0

我的东西你的解决方案是正确的。我prefere做有点不同(但是我不会说这是更好):

bcrypt.genSaltAsync(5) 
.then(function (salt) { 
    return bcrypt.hash(user.fb, salt, null); 
}) 
.then(function (hash) { 
    user.fb = hash; 
}) 
.then(function(){ 
    return bcrypt.genSaltAsync(5); 
}) 
.then(function (salt) { 
    return bcrypt.hash(user.ap, salt, null); 
}) 
.then(function (hash) { 
    user.ap = hash; 
}) 
.then(function() { 
    callback(); 
}) 
.catch(function (err) { 
    callback(err); 
}); 

我喜欢我的解决方案,因为一切都在一个流动乍一看,你知道是怎么回事。在我的解决方案中,第一个盐函数是在第一个后解析在你的解决方案中,每个解决方案并行(我不检查每个解决方案的性能)