我正在使用 NodeJS、bcrypt-nodejs ( https://github.com/shaneGirish/bcrypt-nodejs ) 和 Bluebird 作为承诺。想出了这段代码,并想知道是否有更好的方法来做同样的事情。我有模块:
var Promise = require("bluebird"),
bcrypt = Promise.promisifyAll(require('bcrypt-nodejs'));
// ....[some othe code here]
Users.prototype.setPassword = function(user) {
return bcrypt.genSaltAsync(10).then(function(result) {
return bcrypt.hashAsync(user.password, result);
});
};
然后从另一个模块我调用users.setPassword
如下:
app.post('/api/v1/users/set-password', function(req, res, next) {
users.setPassword(req.body).then(function(result) {
// Store hash in your password DB.
console.log(result[1]);
res.json({
success: true
})
})
.catch(function(err) {
console.log(err);
});
});
它总是以“[错误:没有给出回调函数。]”消息结束,因为它bcrypt.hashAsync
似乎需要 4 个参数。原始的、非承诺的hash
方法只需要 3 个。当我将空回调添加到时hashAsync
,它工作正常:
Users.prototype.setPassword = function(user) {
return bcrypt.genSaltAsync(10).then(function(result) {
return bcrypt.hashAsync(user.password, result,function() {});
});
};
有没有更好的方法来做到这一点,而不像上面那样提供空回调?
编辑:
为了回应Bergi的评论..该功能最终会设置密码,我只是在发布问题时并没有那么远。现在已经到这里了,如果有什么不对劲的地方请告诉我:
Users.prototype.setPassword = function(user) {
return bcrypt.genSaltAsync(10).then(function(result) {
return bcrypt.hashAsync(user.password, result, null);
})
.then(function(result) {
// store in database
console.log("stored in database!");
return result;
});
};