You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:18:33