gpt4 book ai didi

node.js - typescript 异步/等待不工作

转载 作者:搜寻专家 更新时间:2023-10-30 21:15:13 24 4
gpt4 key购买 nike

我对目标为 es2017 的 typescript 上的异步/等待有疑问。下面是我的代码:

我的路线.ts:

method: 'POST',
config: {
auth: {
strategy: 'token',
}
},
path: '/users',
handler: (request, reply) {

let { username, password } = request.payload;

const getOperation = User
.findAll({
where: {
username: username
}
})
.then(([User]) => {
if(!User) {
reply({
error: true,
errMessage: 'The specified user was not found'
});
return;
}

let comparedPassword = compareHashPassword(User.password, password);
console.log(comparedPassword);

if(comparedPassword) {
const token = jwt.sign({
username,
scope: User.id

}, 'iJiYpmaVwXMp8PpzPkWqc9ShQ5UhyEfy', {
algorithm: 'HS256',
expiresIn: '1h'
});

reply({
token,
scope: User.id
});
} else {
reply('incorrect password');
}
} )
.catch(error => { reply('server-side error') });

};

我的助手.ts:

export async function compareHashPassword(pw:string, originalPw:string) {
console.log(pw);
console.log(originalPw);
let compared = bcrypt.compare(originalPw, pw, function(err, isMatch) {
if(err) {
return console.error(err);
}
console.log(isMatch);
return isMatch;
});

return await compared;
}

这个授权路由应该在用户登录时返回 JWT token 。但这里的问题是,即使我输入有效密码登录函数 compareHashPassword 也始终返回未定义。

例如当我用 json 字符串调用 api 时

{
"username": "x",
"password": "helloword"
}

当我使用 console.log() 进行跟踪时,日志是:

$2a$10$Y9wkjblablabla -> hashed password stored in db
helloword
Promise {
<pending>,
domain:
Domain {
domain: null,
_events: { error: [Function: bound ] },
_eventsCount: 1,
_maxListeners: undefined,
members: [] } }
true

也许这只是我对将 async/await 与 typescript 一起使用缺乏理解。注意我的环境是:

node : v8.6.0
typescript : v2.5.2
ts-node : v3.3.0
my tsconfig.json //
{
"compilerOptions": {
"outDir": "dist",
"target": "es2017",
"module": "commonjs",
"removeComments": true,
"types": [
"node"
],
"allowJs": true,
"moduleResolution": "classic"
},
"exclude": [
"node_modules"
]
}

最佳答案

为了让 async/await 工作,异步函数必须返回一个 Promise。此外,您必须以这种方式使用 await 关键字调用 async:

您只能在异步函数中调用 await,所以我将其包装在异步函数中

const someFunc = async function() {
return new Promise((resolve, reject) => {
setTimeout(resolve, 100, true);
});
};

(async () => {
const result = await someFunc(); // true
})();

在您的 compareHashPassword 声明和您调用它的方式中,您不满足任何这些规则。

这就是我重写您的代码的方式:

export async function compareHashPassword(pw:string, originalPw:string) {
return new Promise((resolve, reject) => {
bcrypt.compare(originalPw, pw, function(err, isMatch) {
if(err) {
reject(err);
}
console.log(isMatch);
resolve(isMatch);
});
});
}

// and call it this way
(async () => {
const compared = await compareHashPassword(pw, originPw);
})()

看看这篇 async await 博文: https://ponyfoo.com/articles/understanding-javascript-async-await

还有这篇关于 Promises 的博文: https://developers.google.com/web/fundamentals/primers/promises

另外正如@Patrick Roberts 提到的,您可以使用 util.promisify 将异步回调样式函数转换为 Promise,这是 node 8.xx 否则您可以使用具有类似功能的 bluebird 包。

希望对你有帮助

关于node.js - typescript 异步/等待不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46444745/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com