Express async / await错误处理程序中的动态响应状态
我想用异步/ await替换我的Express路由中的promises链。这使代码更干净,更易读。首先看看我的代码。
我之前有过的:
app.post('/search', (req,res) => {
sendRequest(req.body).then( searchDetails => {
res.send(searchDetails);
}).catch( error => {
res.status(404).send(error)
});
});
当前代码:
app.post('/search', asyncMiddleware(async (req,res) => {
const result = await sendRequest(req.body);
res.send(result);
}));
这看起来如何异步中间件:
const asyncMiddleware = checkedFunction => (req, res) => {
Promise
.resolve(
checkedFunction(req, res)
)
.catch( error => {
res.status(400).send(error)
});
};
当我有包含多个错误状态的路由时,问题就开始了。
app.delete('/delete/:id', authenticate, (req, res) => {
const id = req.params.id;
if (!ObjectID.isValid(id)) {
return res.status(404).send();
}
User.findOneAndDelete({
_id: id,
_user: req.user._id
}).then((todo) => {
if (!todo) {
return res.status(404).send();
}
res.send({todo});
}).catch((e) => {
res.status(400).send();
});
});
我怎么能让asyncMiddleware返回状态取决于错误?
回答如下:asyncMiddleware
在这里检查是否有任何错误发生或checkedFunction
故意抛出,即快速路线处理程序。如果你想对asyncMiddleware
说些什么,你需要像对/search
一样用它包装你的路由处理程序,然后你需要抛出涉及你的错误信息的特定错误/对象:
app.delete('/delete/:id', authenticate, asyncMiddleware(async (req, res) => {
const id = req.params.id;
if (!ObjectID.isValid(id)) {
throw {
status: 404,
message: 'id not valid'
}
}
try {
const todo = await User.findOneAndDelete({
_id: id,
_user: req.user._id
});
if (!todo) {
throw {
status: 404,
message: 'todo not found'
}
}
res.send({todo});
} catch (e) {
throw {
status: 400,
message: 'mongodb error'
}
}
}));
然后异步中间件可以发送状态作为响应
const asyncMiddleware = checkedFunction => (req, res) => {
Promise
.resolve(
checkedFunction(req, res)
)
.catch( error => {
res.status(error.status).send(error.message)
});
};
您可以创建内置的Error
对象而不是自定义的对象来跟踪错误调用堆栈,但我认为您不需要这里。
Express async / await错误处理程序中的动态响应状态
我想用异步/ await替换我的Express路由中的promises链。这使代码更干净,更易读。首先看看我的代码。
我之前有过的:
app.post('/search', (req,res) => {
sendRequest(req.body).then( searchDetails => {
res.send(searchDetails);
}).catch( error => {
res.status(404).send(error)
});
});
当前代码:
app.post('/search', asyncMiddleware(async (req,res) => {
const result = await sendRequest(req.body);
res.send(result);
}));
这看起来如何异步中间件:
const asyncMiddleware = checkedFunction => (req, res) => {
Promise
.resolve(
checkedFunction(req, res)
)
.catch( error => {
res.status(400).send(error)
});
};
当我有包含多个错误状态的路由时,问题就开始了。
app.delete('/delete/:id', authenticate, (req, res) => {
const id = req.params.id;
if (!ObjectID.isValid(id)) {
return res.status(404).send();
}
User.findOneAndDelete({
_id: id,
_user: req.user._id
}).then((todo) => {
if (!todo) {
return res.status(404).send();
}
res.send({todo});
}).catch((e) => {
res.status(400).send();
});
});
我怎么能让asyncMiddleware返回状态取决于错误?
回答如下:asyncMiddleware
在这里检查是否有任何错误发生或checkedFunction
故意抛出,即快速路线处理程序。如果你想对asyncMiddleware
说些什么,你需要像对/search
一样用它包装你的路由处理程序,然后你需要抛出涉及你的错误信息的特定错误/对象:
app.delete('/delete/:id', authenticate, asyncMiddleware(async (req, res) => {
const id = req.params.id;
if (!ObjectID.isValid(id)) {
throw {
status: 404,
message: 'id not valid'
}
}
try {
const todo = await User.findOneAndDelete({
_id: id,
_user: req.user._id
});
if (!todo) {
throw {
status: 404,
message: 'todo not found'
}
}
res.send({todo});
} catch (e) {
throw {
status: 400,
message: 'mongodb error'
}
}
}));
然后异步中间件可以发送状态作为响应
const asyncMiddleware = checkedFunction => (req, res) => {
Promise
.resolve(
checkedFunction(req, res)
)
.catch( error => {
res.status(error.status).send(error.message)
});
};
您可以创建内置的Error
对象而不是自定义的对象来跟踪错误调用堆栈,但我认为您不需要这里。