gpt4 book ai didi

javascript - 异步等待在 TypeScript API 中被跳过

转载 作者:行者123 更新时间:2023-11-30 09:10:24 25 4
gpt4 key购买 nike

我在 Controller 中有一个设置结果对象的异步方法。问题不是等待 await 完成执行我的代码而是跳转到响应对象调用,这使得所需的变量未定义。在未定义的错误之后,应该执行的方法中的调试器断点被命中。谁能解释为什么异步等待在这里不起作用?

Controller 类中的方法:

public async loginUser(req: Request, res: Response) {
const { name, password } = req.body;
let result: ILoginResult = await UserData.login(name, password); // always undefined
res.status(result.status).send(result.result); // gets hit before result is set
}

用户数据类:

import bcrypt from 'bcrypt';
import jwt from 'jsonwebtoken';
import mongoose from 'mongoose';
import ILoginResult from './ILoginResult';
import UserModel from '../../models/UserModel';

class UserData {
private connUri: string;

constructor() {
this.connUri = process.env.MONGO_LOCAL_CONN_URL;
}

public async login(name: string, password: string) {

try {
await mongoose.connect(this.connUri, { useNewUrlParser: true, useUnifiedTopology: true, useCreateIndex: true, }, (err) => {
let result: ILoginResult = { status: 0, result: null, error: '', token: '' };
let status = 200;
if (!err) {
UserModel.findOne({ name }, (err, user) => {
if (!err && user) {
// We could compare passwords in our model instead of below as well
bcrypt.compare(password, user.password).then(match => {
if (match) {
status = 200;
// Create a token
const payload = { user: user.name };
const options = { expiresIn: '2d', issuer: 'http://localhost' };
const secret = process.env.JWT_SECRET;
const token = jwt.sign(payload, secret, options);

// console.log('TOKEN', token);
result.token = token;
result.status = status;
result.result = user;
} else {
status = 401;
result.status = status;
result.error = `Authentication error`;
}
return result;
}).catch(err => {
status = 500;
result.status = status;
result.error = err;
return { status: status, result: result };
});
} else {
status = 404;
result.status = status;
result.error = err;
return result;
}
});
} else {
status = 500;
result.status = status;
result.error = err.toString();
return result;
}
});
} catch (e) {
let result: ILoginResult;
result.error = e.toString();
result.status = 500;
return result;
}
}
}

export default new UserData();

最佳答案

不要将 async/await 直接与基于回调的 API 混合使用。

根据 the documentation , mongoose.connect 确实返回一个 promise (前提是你使用的是最新版本),但没有任何迹象表明它让 promise 等待事情发生在你给它的回调中。

相反,在 await mongoose.connect 之后的代码中执行这些操作。

类似的东西(在 UserData 中):

public async login(name: string, password: string) {
let result: ILoginResult = { status: 0, result: null, error: '', token: '' };
try {
await mongoose.connect(this.connUri, { useNewUrlParser: true, useUnifiedTopology: true, useCreateIndex: true, });
const user = await UserModel.findOne({ name });
let status = 200;
let match = await bcrypt.compare(password, user.password).catch(() => false);
if (!match) {
status = 401;
result.status = status;
result.error = `Authentication error`;
return result;
}
status = 200;
// Create a token
const payload = { user: user.name };
const options = { expiresIn: '2d', issuer: 'http://localhost' };
const secret = process.env.JWT_SECRET;
const token = jwt.sign(payload, secret, options);

// console.log('TOKEN', token);
result.token = token;
result.status = status;
result.result = user;
return result;
} catch (e) {
result.error = e.toString();
result.status = 500;
return result;
}
}

关于javascript - 异步等待在 TypeScript API 中被跳过,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59568659/

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