NodeJS的PUT请求未更新对象属性仅返回id如何解决
问题根因
你的PUT接口返回值缺失name字段,是代码中3处问题共同导致的:
- 未配置JSON请求体解析中间件:Express默认不会解析请求中的JSON格式Body,若没有在路由前添加
app.use(express.json()),req.body值为undefined,读取req.body.name会得到undefined。将undefined赋值给genre.name后,Express调用res.send返回对象时,会自动过滤值为undefined的属性,最终响应就只会保留id字段。 - Joi校验传参错误:
validateGenre函数设计为接收包含name属性的对象做校验,但你调用时传入的是req.body.name(字符串或undefined),不符合schema的入参要求,校验逻辑完全失效。 - 错误对象引用错误:校验失败分支中你直接使用了未定义的
error变量,正确的引用路径是result.error,该校验失败时会直接抛出ReferenceError导致接口500异常。
修复方案
按以下步骤调整代码即可:
- 在所有路由定义前添加JSON解析中间件,确保Express能正常解析JSON格式的请求体
- 调整Joi校验的入参,传入完整的
req.body对象而非单个name字段 - 修正校验失败分支的错误引用,从校验返回结果
result中读取错误信息
修复后的完整代码如下:
// 注意:这行必须放在路由定义之前 app.use(express.json()); app.put('/vidly/genres/:id', (req, res) => { const genre = genres.find(g => g.id === parseInt(req.params.id)); if (!genre) return res.status(404).send('The genre was not found.'); const result = validateGenre(req.body); if (result.error) return res.status(400).send(result.error.details[0].message); genre.name = req.body.name; res.send(genre); }); function validateGenre(genre) { const schema = Joi.object({ name: Joi.string().min(3).required() }); return schema.validate(genre); }
验证说明
修复后用Postman发请求时,注意将Body选项设置为raw,格式选择JSON,传入符合格式的参数:
{ "name": "你的分类名称" }
接口会正常返回包含id和更新后name的完整genre对象,校验逻辑也会正常拦截长度不足3位、缺失name字段的非法请求。
内容的提问来源于stack exchange,提问作者zulu_papa
相关产品推荐
相关产品推荐

