token
始终为undefined
。有人可以帮我弄清楚这里出什么问题吗?
[err, token] = await to(comparePassHash(body.password, user.password));`
comparePassHash = async (pass, hash) => {
bcrypt.compare(pass, hash, (err, token) => {
if (err) TE(err);
console.log('test');
return token;
});
};
to = (promise) => {
return promise
.then(data => {
return [null, data];
}).catch(err =>
[pe(err)]
);
};
答案 0 :(得分:0)
之所以undefined
是因为comparePassHash
要解决的问题。
async
关键字将无法正常运行。您将在token
函数内部而不是.compare
内部返回comparePassHash
。您必须用bcrypt.compare
包装Promise
。
const comparePassHash = (pass, hash) => {
return new Promise((resolve, reject) => {
bcrypt.compare(pass, hash, (err, token) => {
if (err)
return reject(err);
console.log('test');
return resolve(token);
});
});
};
执行您的功能:
comparePassHash = async (pass, hash) => {
bcrypt.compare(pass, hash, (err, token) => {
if (err) TE(err);
console.log('test');
return token;
});
// implicit return: undefined
};
如果没有await
,它将执行bcrypt.compare
,因为它不是一个承诺,它不会等到完成,它会退出该函数,并返回undefined
,因为缺少return
语句。
另一种方法是使用Util.promisify
const { promisify } = require('util');
const comparePassHash= promisify(bcrypt.compare);
// This must be inside an async function
[err, token] = await to(comparePassHash(body.password, user.password));