如何在json-server中获取嵌套元素数据?(待办应用场景)
解决json-server中嵌套子任务的获取与删除问题
首先要明确:json-server不支持直接通过嵌套路径(比如tasks/1/mainTasks/1/subtasks/1)访问深层数组元素,同时_embed只适用于关联独立集合的资源(而非嵌套在对象里的数组),这就是你当前方法失效的原因。
下面给两种可行的解决方案:
方案一:重构数据结构为独立集合(推荐)
把mainTasks和subtasks拆成独立的顶层集合,用外键关联到父资源,这样就能利用json-server的原生路由进行CRUD操作:
修改后的db.json结构:
{ "lists": [ {"id": 1, "name": "Listeczka"}, {"id": 2, "name": "TeżListeczka"} ], "tasks": [ {"id": 1, "list_id": 1}, {"id": 2, "list_id": 2} ], "mainTasks": [ {"id": 1, "task_id": 1, "content": "This is task", "state": "NOTDONE"}, {"id": 2, "task_id": 1, "content": "This is task", "state": "NOTDONE"}, {"id": 3, "task_id": 2, "content": "This is task", "state": "NOTDONE"} ], "subtasks": [ {"id": 1, "mainTask_id": 1, "content": "This is subtask", "state": "DONE"}, {"id": 2, "mainTask_id": 1, "content": "This is subtask", "state": "NOTDONE"}, {"id": 3, "mainTask_id": 1, "content": "This is subtask", "state": "NOTDONE"}, {"id": 4, "mainTask_id": 2, "content": "This is subtask", "state": "DONE"}, {"id": 5, "mainTask_id": 2, "content": "This is subtask", "state": "NOTDONE"}, {"id": 6, "mainTask_id": 3, "content": "This is subtask", "state": "DONE"} ] }
这样操作就简单了:
- 获取指定子任务:
GET http://localhost:3000/subtasks/1 - 删除子任务:
DELETE http://localhost:3000/subtasks/1 - 关联查询(比如获取某个task下的所有mainTasks):
GET http://localhost:3000/tasks/1?_embed=mainTasks
方案二:保留嵌套结构,通过整体更新实现删除
如果不想改动数据结构,只能先获取完整的task资源,修改嵌套数组后再整体PUT回去:
- 获取完整task数据:
GET http://localhost:3000/tasks/1
- 前端处理子任务删除:
找到对应mainTasks中id为1的项,过滤掉其subtasks里id为1的元素。比如用JS处理:
// 假设获取到的task数据存在task变量中 const updatedTask = { ...task, mainTasks: task.mainTasks.map(mainTask => { if (mainTask.id === 1) { return { ...mainTask, subtasks: mainTask.subtasks.filter(subtask => subtask.id !== 1) }; } return mainTask; }) };
- PUT更新整个task:
PUT http://localhost:3000/tasks/1 # 请求体为处理后的updatedTask对象
两种方案对比
- 方案一:符合REST设计规范,支持更灵活的查询和操作,适合长期维护的项目。
- 方案二:无需修改数据结构,适合快速原型开发,但每次操作都要处理整个对象,数据量大时效率较低。
内容的提问来源于stack exchange,提问作者Kacper Klimas
相关产品推荐
相关产品推荐

