Postman调用Register API无法传递数据,验证失败求助
问题:Postman发送POST请求到注册API时,请求体数据无法传递,触发必填字段验证错误
我用Postman向Register API发送POST请求,但数据始终传不过去,触发了User模型的必填字段验证错误。试过调整Postman设置、修改验证规则都没用,我是JavaScript新手,求帮忙。
Register API代码
app.use(express.json()); // 中间件 app.post("/register", async (req, res) => { try { const newUser = await User.create(req.body); res.status(200).json(newUser); // 返回新建的用户信息 } catch (error) { res.status(500).json({ message: error.message }); } });
User模型代码
const mongoose = require("mongoose"); const bcrypt = require("bcrypt"); const validateEmail = function (email) { const emailRegex = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/; return emailRegex.test(email); }; const UserSchema = mongoose.Schema({ name: { type: String, required: [true, "请输入你的姓名"], }, email: { type: String, required: [true, "请输入你的邮箱"], validate: { validator: validateEmail, message: "请填写有效的邮箱地址", }, }, password: { type: String, required: [true, "请输入你的密码"], }, }); UserSchema.pre("save", async function (next) { try { const salt = await bcrypt.genSalt(10); const hashedPassword = await bcrypt.hash(this.password, salt); this.password = hashedPassword; next(); } catch (error) { next(error); } }); const User = mongoose.model("User", UserSchema); module.exports = User;
请求信息
请求头
Request Headers Content-Type: application/json User-Agent: PostmanRuntime/7.33.0 Accept: */* Postman-Token: 5da77db1-867b-4919-a02d-c343704b6eb2 Host: localhost:3000 Accept-Encoding: gzip, deflate, br Connection: keep-alive Content-Length: 99
请求体
{ "name":"pratik", "email":"zajampratik@gmail.com", "password":"PratikZajam@1999" }
响应信息
响应头
X-Powered-By: Express Content-Type: application/json; charset=utf-8 Content-Length: 136 ETag: W/"88-VEpd9WSTE7wFAEzw7xIMM06sJpo" Date: Wed, 04 Oct 2023 09:55:22 GMT Connection: keep-alive Keep-Alive: timeout=5
响应体
{ "message": "User validation failed: password: Please Enter Your Password, email: Please Enter Your Email, name: Please Enter Your Name" }
排查与解决方法
确认
express.json()中间件的位置app.use(express.json())必须放在所有路由定义之前,否则路由无法解析JSON请求体。如果路由在其他文件中,要确保这个中间件在引入路由前就注册,示例:const express = require('express'); const app = express(); // 先注册JSON解析中间件 app.use(express.json()); // 再引入并注册路由 app.use('/', require('./routes/register'));检查Postman请求体格式
即使设置了Content-Type: application/json,也要确认Postman的请求体选择raw->JSON格式,而非form-data或x-www-form-urlencoded,选错格式会导致请求体无法被正确解析。验证
req.body是否为空
在注册路由中添加日志,查看实际接收的请求体内容:app.post("/register", async (req, res) => { console.log('接收的请求体:', req.body); // 打印请求体 try { const newUser = await User.create(req.body); res.status(200).json(newUser); } catch (error) { res.status(500).json({ message: error.message }); } });如果控制台打印
{}或undefined,说明确实未解析到请求体,回到第一步检查中间件位置。排查中间件冲突
若项目中安装了旧版body-parser,可能会与Express内置的express.json()冲突。现在Express已内置JSON解析功能,可卸载body-parser避免冲突。
内容的提问来源于stack exchange,提问作者Pratik zajam
相关产品推荐
相关产品推荐

