Post请求参数未识别,Joi校验提示admin必填问题求助
问题描述
我编写了如下Express Post接口/api/carpools,使用Joi校验admin字段(必填、字符串最少3位):
app.post('/api/carpools', (req, res) => { const schema = Joi.object({ "admin": Joi.string().min(3).required() }) const result = schema.validate(req.body) console.log(result) /* if(result.error) { res.status(400).send(result.error.details[0].message) return; }*/ const newCarpool = { carpoolID: carpools.length + 1, admin: req.body.admin, members: [] } carpools.push(newCarpool) res.send(newCarpool) })
使用Postman测试该接口时,已传入对应参数,但控制台输出的校验结果显示req.body为空:
{ value: {}, error: [Error [ValidationError]: "admin" is required] { _original: {}, details: [ [Object] ] } }
已确认路由定义正常,示例数据格式如下:
const carpools = [ {"carpoolID": 1, "admin": 'Sandy', "members": ['Cameron', 'Samantha', 'Stephanie']}, {"carpoolID": 2, "admin": 'Tom', "members": ['Luis,', 'Tyreek', 'John'] }, {"carpoolID": 3, "admin": 'Brandon', "members": ['Joseph', 'Alex', 'David']} ];
创建拼车时成员默认是空数组,仅需传入admin字段,求问为何参数未被接口识别?
解决方案
导致req.body为空的核心原因是Express默认不会自动解析请求体,结合Postman请求配置可能存在问题,按以下步骤修复:
添加请求体解析中间件
Express本身不处理请求体解析,必须手动注册中间件。在路由定义之前添加以下代码,解析JSON格式的请求体:app.use(express.json()); // 若需要支持表单格式请求,可额外添加 app.use(express.urlencoded({ extended: true }));该中间件会自动将请求中的JSON数据转换为JavaScript对象,赋值给
req.body。检查Postman请求配置
- 确认请求方法为
POST,URL正确指向/api/carpools - 在
Body标签下选择raw,格式设置为JSON(不要选Text或其他格式) - 输入符合JSON语法的参数:
{ "admin": "YourAdminName" } - 检查参数是否存在语法错误(如引号闭合、逗号使用正确)
- 确认请求方法为
启用Joi校验逻辑
代码中注释掉了校验错误的返回逻辑,建议取消注释,以便直观返回错误信息:if(result.error) { res.status(400).send(result.error.details[0].message) return; }
内容的提问来源于stack exchange,提问作者AppleDev3
相关产品推荐
相关产品推荐

