我有以下端点:
app.get('/users/:id', async (req, res) => {
const _id = req.params.id;
try {
const user = await User.findById(_id);
if(!user) {
res.status(404).send();
}
res.send(user);
} catch (e) {
res.status(500).send(e);
}});
当我使用有效的用户ID发出请求时,服务器会将用户发回,这没问题。
问题是当我尝试查找ID在数据库中不存在的用户时。服务器应返回 404错误,但它会发回错误500 ,我不明白为什么!
有人可以帮我吗?
提前谢谢!
答案 0 :(得分:2)
一种处理错误的好方法是创建一个express error middleware,这使您可以将所有错误处理都放在一个地方,这样就不必多次编写它。
当您使用异步路由处理程序时,如果答应拒绝,则使用express时,错误将自动传递给下一个错误中间件。
// First register all of your routes
app.get('/user/:id', async (req, res) => {
const user = await User.findById(req.params.id);
if(!user) return res.status(404).send();
res.send(user);
})
// Then register you error middleware
app.use((err, req, res, next) => {
console.error(err.message)
// if mongoose validation error respond with 400
if(err.message.toLowerCase().includes('validation failed'))
return res.sendStatus(400)
// if moongoose failed because of duplicate key
if(err.message.toLowerCase().includes('duplicate key'))
return res.sendStatus(409)
// if mongoose failed to cast object id
if(err.message.toLowerCase().includes('objectid failed'))
return res.sendStatus(404)
res.sendStatus(500)
})
答案 1 :(得分:0)
谢谢您的回答。
我已解决它,将以下内容添加到用户模型架构中:
_id: {type: String}
并在发送404错误之前添加返回:
app.get('/users/:id', async (req, res) => {
const _id = req.params.id;
try {
const user = await User.findById(_id);
if (!user) {
return res.status(404).send();
}
res.send(user);
} catch (error) {
res.status(400).send(error);
}});