【发布时间】:2016-07-25 02:37:31
【问题描述】:
我正在尝试使用一系列承诺来验证用户名和密码,但这些承诺似乎解决得太早了。
我有来自这里涉及的两个不同文件的两种方法。
首先,我的控制器接收请求并调用我的模型进行身份验证。该模型应该返回一个承诺,该承诺将在它解析时具有身份验证结果。
这是我的控制器:
router.post('/api/auth-tokens', function (req, res, next) {
var creds = {user: req.body.user, password: req.body.password};
people.authenticate(creds)
.then(function (result) {
var status = result.valid ? 200: 401;
res.sendStatus(status);
});
});
people 是词法范围模型。这是上面使用的方法的当前实现:
var bluebird = require('bluebird');
var bcrypt = require('bcrypt');
var compare = bluebird.promisify(bcrypt.compare);
exports.authenticate = function (args) {
var promise = orm.select({
db: db,
table: table,
where: {id: args.user},
qrm: 'one'
});
promise.catch(function (err) {
var auth_info = { valid: false };
return auth_info;
});
promise.then(function (user) {
var promise = compare(args.password, user.hash)
.then(function (same) {
var auth_info = { valid: same, permissions: user.permissions };
return auth_info;
});
return promise;
});
return promise;
};
orm 返回一个promise,如果用户不存在则抛出错误,或者如果找到用户则解析并产生数据库行。 (这就是为什么我在那里有 promise.catch 调用。以防用户不存在)
如果用户确实存在,我想调用bcrypt.compare 将输入与数据库行中包含的哈希值进行比较。当异步完成时,我想解析承诺链并将控制权返回给控制器,返回 results 对象。
我遇到的问题是,我的控制器中的.then 正在立即执行,并且调用orm.select 返回了初始承诺的结果。谁能解释为什么会发生这种情况以及我该如何解决?
【问题讨论】:
标签: javascript promise bluebird