我有一个 API 端点,用户可以在其中指定他想要删除的集合的 ID。路由器读取 json 文件,迭代集合并删除找到的记录:
router.delete('/todos/:id', (req,res)=>{
const id = req.params.id
fs.readFile('todos.json', 'utf8', (err,data) =>{
if (err) throw err
const JSONdata = JSON.parse(data)
JSONdata.todos.forEach((todo, index)=>{
if(todo.id == id){
JSONdata.todos.splice(index,1)
fs.writeFile('todos.json',JSON.stringify(JSONdata), 'utf8', (err) =>{
if (err) throw err
return res.json({"deleted" : true})
})
}
})
})
res.status(404).json({errors: ['task not found']})
})
但是,我收到此错误,而不是正确的响应 {"deleted": true}:
Server is running on port 3000 _http_outgoing.js:470 throw new ERR_HTTP_HEADERS_SENT('set'); ^
Error [ERR_HTTP_HEADER
我知道这与 Node 的异步性质有关。但我确信添加 return 关键字 if 循环找到特定记录将使其工作。我该如何修复它?
最佳答案
开玩笑一点改变:
router.delete('/todos/:id', (req,res)=>{
const id = req.params.id
fs.readFile('todos.json', 'utf8', (err,data) =>{
if (err) throw err
const JSONdata = JSON.parse(data)
JSONdata.todos.forEach((todo, index)=>{
if(todo.id == id){
JSONdata.todos.splice(index,1)
fs.writeFile('todos.json',JSON.stringify(JSONdata), 'utf8', (err) =>{
if (err) throw err
return res.json({"deleted" : true})
})
}
})
return res.status(404).json({errors: ['task not found']})
})
})
关于javascript - Node : route try to send response two times - ERR_HTTP_HEADERS_SENT ('set' ); error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61047266/