Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb Mongoose:为找不到文档定义404状态无效_Mongodb_Express_Mongoose_Async Await - Fatal编程技术网

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

一、 我正在学习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.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)以确保格式有效,效果会更好。代码如下:
2.使用findOne()方法而不是findById

如果需要更简单的解决方案,请不要使用findById,因为函数需要有效的ObjectId。我们可以使用FindDone()方法:

(依我看,第一种解决方案更好)

一些有用的链接:


当错误发生时,您能否提供req.params.id的值,以及console.log在catch块中记录错误?正如您所说,我将错误记录到了控制台中。这出现在控制台中:CastError:Cast to ObjectId在processtick和rejections中,对于模型“User”的路径“\u id”处的值“6082d50a2c89db3164”,转换到ObjectId失败(internal/process/task_queues.js:93:5){messageFormat:undefined,stringValue:'“6082d50a2c89db3164”“,种类:'ObjectId',值:'6082d50a2c89db3164',路径:'u id',原因:错误:传入的参数必须是一个12字节的字符串或一个24个十六进制字符的字符串您完全正确。我提供给测试的id无效。它只接受有12个字符的id,但我错误地提供了一个少于12个字符的id,所以它立即执行了catch块。非常感谢您的帮助,它真的很有帮助,尤其是验证代码!
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()
}
})