Javascript 我的代码是使用async await的最佳方式吗?
我试图在我的登录示例中实现和学习异步等待函数,但我不知道这是否是最好的、优雅的和干净的代码。我在捕捉错误时遇到了一些麻烦,如果我需要以最好的方式实现常量和函数编程的话。你能分享你的观点吗Javascript 我的代码是使用async await的最佳方式吗?,javascript,express,async-await,Javascript,Express,Async Await,我试图在我的登录示例中实现和学习异步等待函数,但我不知道这是否是最好的、优雅的和干净的代码。我在捕捉错误时遇到了一些麻烦,如果我需要以最好的方式实现常量和函数编程的话。你能分享你的观点吗 谢谢你的代码显示了几个问题: 您试图发送双重响应。首先抛出res.status404.json。。。。然后,捕获该异常并再次执行res.status404.jsone。那是不对的。如果要发送响应,请返回,不要抛出。或者,只抛出异常而不发送响应,然后从catch处理程序发送实际的错误响应 另外,抛出res.sta
谢谢你的代码显示了几个问题:
您试图发送双重响应。首先抛出res.status404.json。。。。然后,捕获该异常并再次执行res.status404.jsone。那是不对的。如果要发送响应,请返回,不要抛出。或者,只抛出异常而不发送响应,然后从catch处理程序发送实际的错误响应 另外,抛出res.status404.json{error:'No match'};发送响应,然后抛出.json返回的可能不是您想要的结果。这不会是任何类型的错误对象 我更喜欢将发送错误响应的位置集中到请求处理程序中的一个位置。在我看来,这使您永远不会尝试发送多个响应,只会使请求处理程序的流程更容易理解 为此,我只抛出一个自定义错误,该错误可能与自定义消息/状态关联,然后在一个位置捕获所有可能的错误。这里有一种方法。myError类可以在项目中的任何地方使用,而不仅仅限于一条路线。其思想是,通常在抛出时,您知道在该上下文中希望状态和消息是什么,因此您可以在自定义错误对象中设置该状态和消息,然后可以在catch中使用该信息。然后,catch必须确定它是有您的自定义错误,还是只有一个常规错误。首先,我有一个可重用的错误子类,它不仅允许我抛出一条消息,还允许我抛出一个状态值
// reusable error class that contains a status in addition to the message
class MyError extends Error {
// this static method saves having to compare if it's a custom error object or not
// every time we use this
static sendError(res, e, status = 500) {
if (e instanceof MyError) {
e.sendError(res);
} else {
res.sendStatus(status);
}
}
constructor(msg, status = 500) {
// allow calling with or without new
if (!(this instanceof MyError)) {
return new MyError(msg, status);
}
super(msg);
this.status = status;
}
sendError(res) {
res.status(this.status).send(this.message);
}
}
下面是如何在代码中使用它,并集中发送错误状态
app.post('/', async (req, res) => {
try {
const { email } = req.body.email; // destructuring
const usuarioEncontrado = await Usuario.findOne({email: email});
// Validate user exist
if (!usuarioEncontrado) { // when not exist return null
throw MyError('El usuario no existe', 404);
}
// validate user pass
if (!bcrypt.compareSync(req.body.password, usuarioEncontrado.password)) {
throw MyError('No Match', 404);
}
const token = jwt.sign( // generate token
{
usuario: usuarioEncontrado
},
SEED,
{
expiresIn: (60 * 60)
}
);
res.status(200).json({ // send response
token: token,
usuario: usuarioEncontrado
});
} catch (e) { // log and send error response
// e may be either MyError or some other system generated Error
console.log(e);
MyError.sendError(res, e);
}
}
如果你有问题,并且没有找到任何有用的答案,你应该尝试一些东西并问一个问题。你试图发送双重回复。首先抛出res.status404.json。。。。然后,捕获该异常并再次执行res.status404.jsone。那是不对的。如果要发送响应,请返回,不要抛出。或者,只抛出异常而不发送响应,并从catch处理程序发送实际的错误响应;发送响应,然后抛出.json返回的可能不是您想要的结果。这不会是任何类型的错误对象。
app.post('/', async (req, res) => {
try {
const { email } = req.body.email; // destructuring
const usuarioEncontrado = await Usuario.findOne({email: email});
// Validate user exist
if (!usuarioEncontrado) { // when not exist return null
throw MyError('El usuario no existe', 404);
}
// validate user pass
if (!bcrypt.compareSync(req.body.password, usuarioEncontrado.password)) {
throw MyError('No Match', 404);
}
const token = jwt.sign( // generate token
{
usuario: usuarioEncontrado
},
SEED,
{
expiresIn: (60 * 60)
}
);
res.status(200).json({ // send response
token: token,
usuario: usuarioEncontrado
});
} catch (e) { // log and send error response
// e may be either MyError or some other system generated Error
console.log(e);
MyError.sendError(res, e);
}
}