如何在JSON Server中添加嵌套于Categories下的item资源
首先得明确:json-server的默认路由是基于顶层资源生成的,你的数据结构里Categories是顶层数组,而item是每个Category对象里的嵌套数组,所以直接用/Categories/item这种路径肯定不生效——它不知道你要操作哪个具体分类下的item。下面给你两种实用的解决思路:
方法一:用嵌套资源的正确路由(无需自定义路由)
json-server支持针对单个分类的嵌套操作,核心是先定位到具体的Category,再对它的item数组做操作:
方式1:追加item到指定分类
如果你只想给某个分类(比如id为1的分类)添加新item,直接用POST请求到嵌套路径即可:
this._http.post('http://localhost:3000/Categories/1/item', { product_id: 4, description: "Pizza4", price: 14.99, pickup: 1 })
这个请求会自动把新item追加到id为1的Category的item数组里,还会自动给新item分配唯一id。
方式2:全量更新分类的item数组
如果你需要替换整个item数组(比如修改原有item同时添加新的),可以用PATCH请求:
// 假设你已经拿到了该分类原有的item数组 const existingItems = [...]; this._http.patch('http://localhost:3000/Categories/1', { item: [...existingItems, { product_id: 4, description: "Pizza4", price: 14.99, pickup: 1 }] })
方法二:自定义路由(简化路径)
如果你觉得每次写/Categories/:id/item太繁琐,想把路径简化成比如/items/:categoryId,可以通过自定义路由实现:
- 在项目根目录创建
routes.json文件,内容如下:
{ "/items/:categoryId": "/Categories/:categoryId/item" }
- 启动json-server时指定这个路由文件:
json-server --watch your-db.json --routes routes.json
之后你就可以用POST http://localhost:3000/items/1来给id为1的分类添加item,效果和方法一完全一致。
额外建议:调整数据结构(可选,更符合RESTful规范)
如果你的业务里item是独立的资源,建议把数据改成顶层数组的形式,这样json-server会自动生成完整的CRUD路由:
{ "Categories": [ { "id": 1, "name": "披萨分类" } ], "Items": [ { "id": 1, "product_id": 1, "description": "Pizza1", "price": 12.99, "pickup": 0, "category_id": 1 }, { "id": 2, "product_id": 2, "description": "Pizza2", "price": 8.99, "pickup": 1, "category_id": 1 } ] }
这样添加item直接用POST /Items,通过category_id关联分类;查询分类下的item可以用/Categories/1?_embed=Items,这种结构在多数场景下更灵活易用。
你之前失败的原因就是把item当成了顶层资源,但你的数据里并没有顶层的item数组,所以路由不生效。按照上面的方法试试,应该就能解决问题啦!
内容的提问来源于stack exchange,提问作者Monkey




