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

Next.js使用jest+node-mocks-http测试时自动bodyParser失效问题

问题根因

Next.js 内置的bodyParser属于API路由的前置中间件,仅在Next.js服务接收真实HTTP请求、调用业务handler之前自动执行。测试代码里直接导入handler函数、用node-mocks-http构造模拟对象传参的写法,完全跳过了Next.js的中间件执行链路,根本不会触发自动解析逻辑。
这种场景下传入的req.body是JSON.stringify处理后的字符串,直接读取req.body.name会得到undefined,如果业务逻辑没做容错就会抛错,自然拿不到预期的200状态码。

解决方案

你可以根据测试场景选择对应方案:

方案1:单元测试场景(推荐,执行效率最高)

单元测试的核心目标是验证自研业务逻辑的正确性,你不需要为Next.js官方维护的内置bodyParser能力编写测试用例。只需要在构造mock请求时,直接传入解析完成的JS对象作为body即可,不需要做JSON序列化处理:

import handler from "pages/api/index.js";
import { createMocks } from "node-mocks-http";

describe("POST", () => {
  it("Returns Statuscode 200 on valid req", async () => {
    const { req, res } = createMocks({
      method: "POST",
      // 直接传JS对象,不要JSON.stringify
      body: {
        name: "Name of the object",
      },
      headers: {
        "Content-Type": "application/json",
      },
    });

    await handler(req, res);
    expect(res.statusCode).toBe(200);
  });
});

方案2:集成/端到端测试场景

如果你需要覆盖包括Next.js内置中间件在内的完整请求处理链路,不要直接导入handler函数调用,可以借助测试工具启动本地Next.js测试服务,发送真实的HTTP请求触发完整流程,这种模式下会自动执行所有内置中间件逻辑,包括bodyParser的解析。

附:可正常运行的业务代码参考

前端页面代码(pages/index.jsx):

// index.jsx
export default function Home(props){
   const handleClick = async () => {
      await fetch(`/api/index`, {
      body: JSON.stringify({
        name: "My fancy name"
      }),
      method: "POST",
      headers: {
        "Content-Type": "application/json",
      },
    });
   }

   return(<button onClick={handleClick}>FETCH</button>)
}

API路由代码(pages/api/index.js):

// api/index.js 
export default async function handler(req, res) {
    switch (req.method) { 
      case "POST":
        // 前端真实调用时会被Next.js自动解析
        console.log(req.body.name)
        res.status(200).json({message:"Okay"});
        break;
  
      default:
        res.setHeader('Allow', ['POST'])
        res.status(405).end(`Method ${req.method} Not Allowed`)
        break;
    }
}
异常快速排查点

如果调整后仍有问题,可以逐一核对以下配置:

  • 确认API路由文件没有手动关闭bodyParser:检查文件中是否存在export const config = { api: { bodyParser: false } }配置,存在的话删除即可恢复默认自动解析
  • 确认请求的Content-Type头和实际发送的body格式匹配,发送JSON数据时必须设置Content-Type: application/json
  • 确认handler中对非目标请求方法做了正确的状态码返回,避免其他请求方法误入逻辑分支

注:Next.js默认配置下API路由已自动开启bodyParser能力,不需要额外添加配置项手动启用。


内容的提问来源于stack exchange,提问作者Placeprom

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 23:24:14