如何在Mongoose查询无效ObjectId时返回404而非cast错误
错误原因
当传入的safeid不符合MongoDB ObjectId的格式要求(标准ObjectId为24位十六进制字符串)时,Mongoose执行findById方法会直接抛出CastError,而非返回空查询结果;另外即便safeid格式合法,若数据库中不存在对应id的Safe记录,后续渲染逻辑也会出现异常,两种场景都需要单独处理返回404。
解决方案
你可以通过先校验ID格式、判断查询结果非空、兜底捕获异常三个步骤处理该问题,修改后的路由代码如下:
// 注意要在路由回调中加入next参数,用于传递其他类型错误 app.get('/mysafe/:safeid',isLoggedIn,isAuthor, async(req,res,next)=> { const { safeid } = req.params; // 1. 先校验safeid是否为合法的ObjectId格式 if (!mongoose.Types.ObjectId.isValid(safeid)) { // 可根据需求替换为渲染404页面的逻辑 return res.status(404).send('您访问的资源不存在'); } try { const safe=await Safe.findById(safeid).populate('author') // 2. 格式合法但数据库无对应记录的情况处理 if (!safe) { return res.status(404).send('您访问的资源不存在'); } const password = await Password.find({safe:safeid}).populate('safe') res.render('passwords/index', { password,safe }) } catch(err) { // 3. 兜底捕获CastError类型错误 if (err.name === 'CastError') { return res.status(404).send('您访问的资源不存在'); } // 其他类型错误传递给全局错误处理中间件 next(err); } })
内容的提问来源于stack exchange,提问作者zzz
相关产品推荐
相关产品推荐

