You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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异常。
修复方案

按以下步骤调整代码即可:

  1. 在所有路由定义前添加JSON解析中间件,确保Express能正常解析JSON格式的请求体
  2. 调整Joi校验的入参,传入完整的req.body对象而非单个name字段
  3. 修正校验失败分支的错误引用,从校验返回结果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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 22:06:23