传入错误URL ID时mongoose.findById调用失败,如何优化错误提示?
问题解答
为什么传入错误ID时mongoose.findById会调用失败?
MongoDB的ObjectId有严格格式规范:必须是12字节的二进制数据、24位十六进制字符串,或是合法整数。当URL中的ID不符合该规范时,mongoose.findById在尝试将参数转换为ObjectId的过程中会直接抛出BSONTypeError,而非返回null,这就是调用失败的核心原因。
如何优化错误提示,让原因更清晰?
你可以通过两种方式优化错误处理,返回更直观的提示:
方式1:提前验证ObjectId格式
在调用findById前,用mongoose自带的isValidObjectId方法校验ID格式,提前拦截非法请求:
router.get('/:id', async (request, response) => { try{ // 先校验ID格式合法性 if (!mongoose.Types.ObjectId.isValid(request.params.id)) { return response.status(400).send("传入的ID格式不正确,请提供合法的24位十六进制字符串ID"); } const user_obj = await User.findById(request.params.id); if (!user_obj) return response.status(404).send("未找到对应ID的用户"); return response.send(user_obj); } catch(error){ console.log(error); return response.status(500).send("服务器内部错误"); } });
方式2:在catch中判断错误类型返回提示
若不想提前校验,可在catch块中判断错误类型,针对性返回友好提示:
router.get('/:id', async (request, response) => { try{ const user_obj = await User.findById(request.params.id); if (!user_obj) return response.status(404).send("未找到对应ID的用户"); return response.send(user_obj); } catch(error){ console.log(error); if (error.name === 'BSONTypeError') { return response.status(400).send("传入的ID格式不正确,请提供合法的用户ID"); } return response.status(500).send("服务器内部错误"); } });
注意:原代码最后一行return response.status(400).send("done.");会导致重复响应问题(try/catch中已返回响应后,该行仍会执行),建议移除或调整位置,避免出现Cannot set headers after they are sent to the client错误。
内容的提问来源于stack exchange,提问作者Hassan Shahzad
相关产品推荐
相关产品推荐

