[英]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.