【发布时间】:2017-08-24 20:13:56
【问题描述】:
首先我知道这个问题已经被问过很多次了,但我不知道该怎么做。 我是 Node.js 的新手,正在处理它的异步方面。
这是我的代码
passport.use(new LocalStrategy({ usernameField: 'email', passwordField: 'password' }, function (email, pass, done) {
Users.query(email).exec(function (err, item) {
const message = 'Login Invalid';
if (err) return done(err);
var promise = GetHash({ item, pass });
promise.then((data) => {
return done(null, data)
}).catch((err) => {
console.log(err);
return done(null, false, { message });
});
});
}));
function GetHash(userPasswordRequest) {
return new Promise(function (resolve, reject) {
if (userPasswordRequest.item && userPasswordRequest.item.Items[0]) {
var userRecord = userPasswordRequest.item.Items[0].attrs;
if (userRecord.old) {
if (crypto.createHash('sha256').update(userPasswordRequest.pass, 'ucs-2').digest('base64') === userRecord.password) {
var newHash = bcrypt.hashSync(userPasswordRequest.pass, 10);
Users.update({ email: userRecord.email, password: newHash, old: null }, function (err, newItem) {
if (err) { console.log(err); } else {
console.log('first call');
resolve(newItem.attrs);
}
});
}
}
else {
if (bcrypt.compareSync(userPasswordRequest.pass, userRecord.password)) {
console.log('first call');
resolve(userPasswordRequest.item.Items[0].attrs);
}
}
}
reject();
})
}
问题在这里:
if (crypto.createHash('sha256').update(userPasswordRequest.pass, 'ucs-2').digest('base64') === userRecord.password) {
var newHash = bcrypt.hashSync(userPasswordRequest.pass, 10);
Users.update({ email: userRecord.email, password: newHash, old: null }, function (err, newItem) {
if (err) { console.log(err); } else {
console.log('first call');
resolve(newItem.attrs);
}
});
}
因为Users.update 是异步的,我在解决它之前拒绝了承诺。
我尝试了很多东西,承诺中的承诺和许多其他东西,但我无法使这个工作正常。
任何帮助将不胜感激
【问题讨论】:
-
你不会把所有东西都放在一个巨大的 Promise 中,而是将它拆分成一个 Promise 链。因此,首先获取用户,然后将其作为两个单独的操作进行加密。如果链的任何部分发生故障,它会中止链并允许您在整个链中的一个位置捕获错误。
-
听起来您只是在
reject()调用前面缺少了一个else? -
你在使用特定的 promise 库吗?
-
@Bergi 我正在使用来自 Node.js 4.x 的内置承诺
-
@Theo Btw, dynamodb appears to already return promises - 所以你根本不需要任何
new Promise
标签: javascript node.js asynchronous promise amazon-dynamodb