Node.js中Multer中间件在Postman中req.body为空、req.file未定义问题
解决Postman发送Multer请求时req.body/req.file异常的问题
我来帮你捋清楚这个问题——你遇到的情况不是Postman的Bug,主要是请求设置的细节没做对,毕竟Postman和浏览器/Axios在自动处理请求头的逻辑上有区别,咱们一步步来修正:
核心问题:错误取消了Content-Type请求头
你提到取消了Postman里的Content-Type头,这反而会导致服务器无法正确解析multipart/form-data类型的请求。当发送包含文件的表单请求时,必须要有正确的Content-Type头,且要包含自动生成的boundary分隔符。Axios在发送FormData时会自动帮你处理这个头,但Postman里如果手动取消,服务器就不知道怎么拆分请求里的文件和表单数据了。
Postman的正确设置步骤
按照下面的步骤重新配置请求,就能解决问题:
- 打开Postman,选择POST请求,填入正确的接口地址(比如
http://localhost:xxx/api/auth/test)。 - 切换到Body标签,选中
form-data选项(不要选raw或其他类型)。 - 添加文件字段:
- 键名填
profilePicture(必须和你Multer代码里upload.single('profilePicture')的参数完全一致)。 - 右侧类型选择
File,然后点击“Select Files”选择要上传的文件。
- 键名填
- 如果需要发送表单数据(对应
req.body),继续添加新的键值对:- 键名填你需要的字段名(比如
username),右侧类型选择Text,然后填入对应的值。
- 键名填你需要的字段名(比如
- 不要手动修改或删除Content-Type请求头:Postman会自动为form-data请求生成正确的
multipart/form-data; boundary=----WebKitFormBoundaryxxx头,这个boundary是服务器解析请求的关键,手动干预会导致解析失败。
代码里的小细节修正(无关Postman问题,但能避免混淆)
你的Controller代码里用了req.files(复数),但因为你用的是upload.single(),正确的应该是req.file(单数),修改后控制台才能正确打印出上传的文件信息:
const test = (req, res) => { console.log(req.body) console.log(req.file) // 这里改成单数file res.json({body:req.body, file:req.file}) }
验证效果
按照上面的设置重新发送请求,你应该就能看到控制台输出正常的req.body和req.file,接口返回的JSON也能正确包含表单数据和文件信息了。
内容的提问来源于stack exchange,提问作者George Bagiryan
相关产品推荐
相关产品推荐

