如何使用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!`) })
关键改动说明
- 过滤无效属性:通过
Object.fromEntries和filter筛选出请求体中实际存在的属性,避免undefined值覆盖原有属性。 - 对象合并:使用扩展运算符
...book保留原有书籍的所有属性,再用...updateData覆盖传入的属性——未传入的字段会自动保留原有值。 - 固定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
相关产品推荐
相关产品推荐

