HapiJS发送Delete请求时返回400错误,请求排查解决
Delete请求返回400错误的排查与解决
我最近用Hapi和MongoDB做删除功能时,发送Delete请求一直收到"statusCode": 400的错误,折腾了半天没找到问题,下面是我的相关代码,想请大家帮忙看看:
路由层代码(delete.route.js)
async handler(req) { const { portfolioId } = req.params const deletePortfolio = await service.deletePortfolio(portfolioId) return deletePortfolio },
服务层代码
async deletePortfolio(portfolioId) { const deletePortfolio = await this.model.findOneAndDelete({ _id: portfolioId, }) return deletePortfolio }
可能的问题分析
400错误一般是请求参数有问题,结合我的代码,大概率是这几个原因:
- ObjectId格式不匹配:MongoDB的
_id是ObjectId类型,如果我传入的portfolioId不是有效的ObjectId字符串,findOneAndDelete会直接失败,但当前代码没做任何验证和错误处理,Hapi就返回了400。 - 路由参数未正确解析:可能路由路径没配置对,导致
req.params里拿不到正确的portfolioId,比如路由没写/{portfolioId}。 - 无错误捕获机制:服务层如果抛出异常(比如无效ID),路由层没处理,直接导致请求报错。
修复建议
1. 服务层添加ID验证和错误处理
先验证ID格式,再捕获可能的异常:
// 若使用mongoose则导入:const { ObjectId } = require('mongoose'); const { ObjectId } = require('mongodb'); async deletePortfolio(portfolioId) { // 先检查ID格式是否有效 if (!ObjectId.isValid(portfolioId)) { throw new Error('无效的Portfolio ID格式'); } try { const deletedPortfolio = await this.model.findOneAndDelete({ _id: new ObjectId(portfolioId), }); // 如果没找到要删除的文档,抛出对应错误 if (!deletedPortfolio) { throw new Error('Portfolio不存在'); } return deletedPortfolio; } catch (error) { throw error; // 把错误抛给路由层处理 } }
2. 路由层添加错误捕获,返回明确的HTTP状态码
用Hapi的Boom工具返回对应错误,让前端能明确知道问题:
const Boom = require('@hapi/boom'); // 需要先安装并导入Boom async handler(req) { try { const { portfolioId } = req.params; const deletedPortfolio = await service.deletePortfolio(portfolioId); return deletedPortfolio; } catch (error) { if (error.message.includes('无效的Portfolio ID格式')) { return Boom.badRequest('请传入有效的Portfolio ID'); } else if (error.message.includes('Portfolio不存在')) { return Boom.notFound('要删除的Portfolio不存在'); } // 其他未知错误返回500 return Boom.internal('删除Portfolio失败,请稍后重试'); } }
3. 额外检查点
- 确认路由配置:注册路由时,路径要写成
/portfolio/{portfolioId},方法是'delete'。 - 检查请求URL:发送请求时,URL里的
portfolioId必须是MongoDB里存在的有效ObjectId字符串,比如60d21b4667d0d8992e610c85这种格式,不能是数字或者其他乱码。
内容的提问来源于stack exchange,提问作者Joseph Chambers
相关产品推荐
相关产品推荐

