JSON文档:
{
"_id" :
"description": "task1",
"completed": false,
"subTask": [
{
"taskID": "01",
"subTaskCompletion": "false",
"subTaskDescription": "task 1 sub task 1 desc"
},
{
"taskID": "02",
"subTaskCompletion": "false",
"subTaskDescription": "task 1 sub task 2 desc"
}
]
}
我可以使用以下代码更新“说明”和“完成”:
Node.js:
router.patch('/tasks/:id', auth, async (req, res) => {
const updates = Object.keys(req.body)
const allowedUpdates = ['description', 'completed']
const isValidOperation = updates.every((update) => allowedUpdates.includes(update))
if (!isValidOperation) {
return res.status(400).send({ error: 'Invalid updates!' })
}
try {
const task = await Task.findOne({ _id: req.params.id})
if (!task) {
return res.status(404).send()
}
updates.forEach((update) => task[update] = req.body[update])
await task.save()
res.send(task)
} catch (e) {
res.status(400).send(e)
}
})
我将这些作为请求正文传递
{
"description": "task modified",
"completed": true
}
但是,我找不到将“ taskID”为“ 01”的subTask的“ subTaskCompletion”更新为“ true”的方法
答案 0 :(得分:0)
您可以尝试--
router.patch('/tasks/:id', auth, async (req, res) => {
const updates = Object.keys(req.body)
const allowedUpdates = ['description', 'completed', 'subTask']
const isValidOperation = updates.every((update) => allowedUpdates.includes(update))
if (!isValidOperation) {
return res.status(400).send({ error: 'Invalid updates!' })
}
try {
const task = await Task.findOne({ _id: req.params.id})
if (!task) {
return res.status(404).send()
}
updates.forEach((update) => {
task[update] = update === 'subTask'
? task[update].map(subTask => subTask.taskID === req.body[update].taskID ? req.body[update] : subTask)
: req.body[update]
})
await task.save()
res.send(task)
} catch (e) {
res.status(400).send(e)
}
并通过
{
"description": "task modified",
"completed": true,
"subTask": {
"taskID": "01",
"subTaskCompletion": "true"
}
}
答案 1 :(得分:0)
在请求正文中添加一个新字段,该字段包含您要标记为已完成的子任务ID。
在示例中,名为markSubTasksDone
的字段需要输入代码:
router.patch('/tasks/:id', auth, async (req, res) => {
const updates = Object.keys(req.body)
const allowedUpdates = ['description', 'completed', 'markSubTasksDone'] // add a new field
const isValidOperation = updates.every((update) => allowedUpdates.includes(update))
if (!isValidOperation) {
return res.status(400).send({ error: 'Invalid updates!' })
}
try {
const task = await Task.findOne({ _id: req.params.id })
if (!task) {
return res.status(404).send()
}
updates.forEach((update) => task[update] && (task[update] = req.body[update])) // make sure `update` property is exist
// mark subTask as done
const listSubTaskIds = req.body.markSubTasksDone
if (listSubTaskIds && listSubTaskIds.length) {
listSubTaskIds.forEach(taskId => {
const subTask = task.subTask.find(i => i.taskId === taskId)
if (subTask) {
subTask.subTaskCompletion = true;
}
});
}
await task.save()
res.send(task)
} catch (e) {
res.status(400).send(e)
}
})
并请求正文:
{
"description": "task modified",
"completed": true,
"markSubTasksDone": ["01"]
}