使用Postman发送POST请求时出现TypeError:无法解构req.body
解决Postman发送POST请求时req.body undefined的问题
问题详情
发送POST请求到http://localhost:6000/api/v1/users/register时,终端和Postman均报错:
TypeError: Cannot destructure property 'fullName' of 'req.body' as it is undefined
打印req.body结果为undefined。
相关代码片段
app.js(中间件配置)
import express from "express" import cors from "cors" import cookieParser from "cookie-parser" const app = express() app.use(cors({ origin: process.env.CORS_ORIGIN, credentials: true })) app.use(express.json({limit: "16kb"})) app.use(express.urlencoded({extended: true, limit: "16kb"})) app.use(express.static("public")) app.use(cookieParser()) //routes import userRouter from './routes/user.routes.js' app.use("/api/v1/users", userRouter) export {app}
user.controller.js(请求处理逻辑)
import {asyncHandler} from '../utils/asyncHandler.js' const registerUser = asyncHandler(async(req,res)=>{ console.log("req.body:", req.body); const {fullName, email, username, password } = req.body console.log("email: ", email, "\n fullname: ",fullName, "\n username: ",username, "\n password: ",password); }) export { registerUser}
asyncHandler.js(错误处理工具)
const asyncHandler = (requestHandler) =>{ return (res,req,next) =>{ Promise.resolve(requestHandler(req,res,next)).catch((err)=>next(err)) } } export {asyncHandler}
Postman配置
请求方式:POST
请求地址:http://localhost:6000/api/v1/users/register
请求体内容:{ "fullName": "John Doe", "email": "john.doe@example.com", "password": "John", "username": "johndoe123" }
问题根源及解决方案
1. 修复asyncHandler参数顺序错误
这是核心问题:asyncHandler返回的函数参数顺序写反了,应该是(req, res, next)而非(res, req, next)。参数顺序颠倒导致req和res传递错误,最终无法正确获取req.body。
修复后的asyncHandler.js:
const asyncHandler = (requestHandler) =>{ return (req, res, next) =>{ // 修正参数顺序 Promise.resolve(requestHandler(req,res,next)).catch((err)=>next(err)) } } export {asyncHandler}
2. 确认Postman请求体格式
确保Postman中请求体选择raw格式,并设置为JSON(而非Text或其他格式),否则express.json()中间件无法解析请求体内容。
3. 验证中间件加载顺序
确认express.json()和express.urlencoded()中间件在路由挂载之前加载(当前app.js已正确配置,此步骤可作为二次验证)。
验证修复
重启后端服务后重新发送请求,此时req.body应能正确获取JSON数据,解构操作不再报错。
内容的提问来源于stack exchange,提问作者Ainz
相关产品推荐
相关产品推荐

