首先,我知道这个问题已被多次询问,但我无法知道如何做到这一点。 我是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
是异步的,我在解决之前拒绝承诺。
我尝试过许多事情,承诺和许多其他事情的承诺,但我无法正常工作。
非常感谢任何帮助
答案 0 :(得分:1)
您不应该使用reject
作为转换,但在发生错误情况时会明确调用。
所以这样:
if (userPasswordRequest.item && userPasswordRequest.item.Items[0]) {
...
} else {
return reject(Error('invalid userPasswordRequest'));
}
还有:
if (bcrypt.compareSync(userPasswordRequest.pass, userRecord.password)) {
console.log('first call');
return resolve(userPasswordRequest.item.Items[0].attrs);
} else {
return reject(Error('invalid password'));
}
这也不对:
if (err) { console.log(err); }
不要只记录错误,拒绝承诺:
if (err) {
console.log(err);
return reject(err);
}
正如您所看到的,在解决或拒绝后返回也是一种很好的形式。