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
相关产品推荐
相关产品推荐

