Mongodb Mongoose:为找不到文档定义404状态无效
一、 我正在学习MongoDB和mongoose,现在我在为我的路由处理程序定义404状态时遇到了一个问题。代码如下:Mongodb Mongoose:为找不到文档定义404状态无效,mongodb,express,mongoose,async-await,Mongodb,Express,Mongoose,Async Await,一、 我正在学习MongoDB和mongoose,现在我在为我的路由处理程序定义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
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(500).send()
}
})
现在,如果我给它一个不存在的id,它不会给我404未找到状态。它只执行catch块,这不是我想要的。
如果您能告诉我哪里出错,或者告诉我如何处理错误,我将不胜感激。
谢谢你解决了这个问题
正如你在日志中看到的
CastError: Cast to ObjectId failed for value "6082d50a2c89db3164" at path "_id" for model "User"
这意味着:您提供给findById
函数(“6082d50a2c89db3164”)的值不是有效的ObjectId。然后执行catch块
暗示
1。在数据库中查询之前验证参数
我知道您试图提供一些数据库中不存在的id进行测试。但是IMHO,两种情况之间存在差异:
- 您提供了有效的id,但在数据库中找不到此id。在这种情况下,它应该返回404
- 您在请求中提供了一个无效的id,它可以是一个类似“6082d50a2c89db3164”的字符串,甚至可以是“#Q*&$(#@*”或我们可以想象的任何内容。在这种情况下,如果我们验证输入(req.params._id)以确保格式有效,效果会更好。代码如下:
app.get('/users/:id', async (req, res) => {
const _id = req.params.id;
// validate params
if(!isValidateObjectId(_id)) { // the function we need to write
res.status(200).send("Invalid params"); // you can define your status and message
return;
}
// good params, get user from database
try {
const user = await User.findById(_id)
if (!user) {
return res.status(404).send()
}
res.send(user)
} catch (error) {
res.status(500).send()
}
})
app.get('/users/:id', async (req, res) => {
const _id = req.params.id
try {
const user = await User.findOne({_id : _id})
if (!user) {
return res.status(404).send()
}
res.send(user)
} catch (error) {
res.status(500).send()
}
})