[英]Node.js return value is undefined
以下代码段中的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)]
);
};
它是undefined
因为这是comparePassHash
解决的。
在这种情况下, async
关键字将无法正常运行。 您将在.compare
函数内而不是comparePassHash
内部返回token
。 您必须用Promise
包装bcrypt.compare
。
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
,直到它完成后才会等待,因为这不是一个承诺,并且它将退出该函数,由于缺少return
语句而返回undefined
。
另一种方法是使用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));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.