Узел: маршрут пытается отправить ответ два раза - ERR_HTTP_HEADERS_SENT ('set'); ошибка - PullRequest
0 голосов
/ 05 апреля 2020

У меня есть конечная точка API, где пользователь может указать идентификатор коллекции, которую он хочет удалить. Маршрутизатор читает файл 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']})
})

Однако вместо правильного ответа {"удалено": true} я получаю эту ошибку:

Сервер работает на порту 3000 _http_outgoing. js: 470 сгенерировать новый ERR_HTTP_HEADERS_SENT ('set'); ^

Ошибка [ERR_HTTP_HEADER

Я знаю, что это связано с асинхронной природой узла. Но я был уверен, что добавление ключевого слова return, если l oop найдет указанную c запись, заставит его работать. Как я могу это исправить?

Ответы [ 2 ]

1 голос
/ 05 апреля 2020

Шутка за небольшое изменение:

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']})
    })
})
1 голос
/ 05 апреля 2020

fs.readFile - это Asyn c функция, это означает, что в вашем коде

res.status (404). json ({errors: ['задача не найдена ']}) Сначала будет запущен

, а затем обратный вызов внутри функции fs.readFile.

Если вы хотите использовать функцию synchroni c, используйте fs. readFileSyn c.

Подробнее об этом можно прочитать здесь https://nodejs.org/api/fs.html#fs_fs_readfile_path_options_callback

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...