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

如何使用PUT路由仅更新特定JSON对象属性,其余属性保持不变?

解决PUT请求仅更新传入属性的问题

你当前的代码会直接用新对象替换原有书籍条目,导致未传入的属性被覆盖为undefined或丢失。要实现仅更新传入的属性,保留未传入的原有值,需要通过对象合并的方式,保留原有属性并仅覆盖传入的字段。

修改后的代码

router.put('/books/:id', (req, res) => {
    const { id } = req.params;
    // 过滤出请求体中实际存在的有效属性(排除undefined值)
    const updateData = Object.fromEntries(
        Object.entries(req.body).filter(([_, value]) => value !== undefined)
    );

    booksDirectory.forEach((book, index) => {
        if (book.isbn === id) {
            // 合并原有书籍属性与更新属性,更新属性优先
            booksDirectory[index] = {
                ...book,
                ...updateData,
                isbn: id // 强制ISBN与路由参数一致,避免传入错误值
            };
        }
    });
    res.send(`The book with ID ${id} has been updated!`)
})

关键改动说明

  1. 过滤无效属性:通过Object.fromEntries和filter筛选出请求体中实际存在的属性,避免undefined值覆盖原有属性。
  2. 对象合并:使用扩展运算符...book保留原有书籍的所有属性,再用...updateData覆盖传入的属性——未传入的字段会自动保留原有值。
  3. 固定ISBN:显式设置isbn: id,确保书籍的ISBN始终与路由参数一致,防止请求体传入错误的ISBN值。

如果需要限制仅允许更新指定字段(比如防止传入额外的非法属性),可以添加字段白名单过滤:

const allowedFields = ['title', 'subtitle', 'author', 'published', 'publisher', 'pages', 'description', 'website'];
const updateData = Object.fromEntries(
    Object.entries(req.body)
        .filter(([key, value]) => allowedFields.includes(key) && value !== undefined)
);

内容的提问来源于stack exchange,提问作者user19643485

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 07:35:17