Express.js使用JOI校验合法数组仍触发错误问题排查
你遇到的问题90%以上是传参格式或者服务端解析配置的问题,常见原因和解决方法如下:
- 原因1:Postman传参时选择了
form-data/x-www-form-urlencoded格式,这两种格式无法直接传递数组类型,服务端拿到的myArrayKey实际是JSON字符串而非数组,自然不符合Joi的数组校验规则。
解决方法:Postman发起请求时,body选择raw > JSON格式,完整传参结构参考:{ "myArrayKey": ["stringA", "stringB"] } - 原因2:Express没有配置JSON解析中间件,无法正确解析请求体里的JSON数据,导致
req.body.myArrayKey未定义或者类型错误。
解决方法:在你的Express入口文件路由注册前,添加JSON解析中间件:const express = require('express') const app = express() // 必须加这一行才能解析application/json格式的请求体 app.use(express.json()) - 原因3:校验时传入的对象错误,比如你把
req.query/req.params传给了Joi校验方法,但参数实际是放在req.body里的。
解决方法:检查校验逻辑的传参是否正确,示例校验逻辑参考:const { mySchema } = require('./你的校验规则文件路径') // 确保是把请求参数所在的对象传入validate方法 const validateResult = mySchema.validate(req.body) if (validateResult.error) { // 错误处理逻辑 } - 排查小技巧:在校验代码前打印参数的类型和值确认是否符合预期:
如果打印出来类型是console.log(typeof req.body.myArrayKey, req.body.myArrayKey)string,就是解析问题;如果是undefined就是没拿到参数。
内容的提问来源于stack exchange,提问作者nTuply
相关产品推荐
相关产品推荐

