错误 [ERR_HTTP_HEADERS_SENT]:将标头发送到客户端后无法设置标头 - Ayuda no se porque sucede eso

Man*_*igh 4 json content-type node.js express

我对 Rest APIs 这个主题很陌生,我正在创建一个简单的主题,在其中接收包含电影数据的 json 并给出一个小响应。由于我是新手,我想从逻辑开始,它是一个保存数据的数组。

但是当我通过 PostMan 发送数据时,它会很好地保存所有内容并完成其工作,但我在控制台上收到此错误。

请有人能指导我

我的代码

router.post('/', (req, res) => {
    const {titulo, director, year, rating} = req.body;
    if (titulo && director && year && rating) {
        const id = movies.length + 1;
        const newMovie = {...req.body, id};
        movies.push(newMovie);
        res.json(movies);
    } else {
        res.status(500).json({error: 'Ha Ocurrido un error'});
    }
    res.send('recibido');
});

module.exports = router;
Run Code Online (Sandbox Code Playgroud)

命令错误

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
    at new NodeError (node:internal/errors:371:5)
    at ServerResponse.setHeader (node:_http_outgoing:576:11)
    at ServerResponse.header (C:\Users\ManuelLeigh\Desktop\restapi\node_modules\express\lib\response.js:776:10)
    at ServerResponse.send (C:\Users\ManuelLeigh\Desktop\restapi\node_modules\express\lib\response.js:170:12)
    at C:\Users\ManuelLeigh\Desktop\restapi\src\routes\movies.js:20:9
    at Layer.handle [as handle_request] (C:\Users\ManuelLeigh\Desktop\restapi\node_modules\express\lib\router\layer.js:95:5)
    at next (C:\Users\ManuelLeigh\Desktop\restapi\node_modules\express\lib\router\route.js:137:13)
    at Route.dispatch (C:\Users\ManuelLeigh\Desktop\restapi\node_modules\express\lib\router\route.js:112:3)
    at Layer.handle [as handle_request] (C:\Users\ManuelLeigh\Desktop\restapi\node_modules\express\lib\router\layer.js:95:5)
    at C:\Users\ManuelLeigh\Desktop\restapi\node_modules\express\lib\router\index.js:281:22
Run Code Online (Sandbox Code Playgroud)

邮递员标题:

Content-Type: application/json
Run Code Online (Sandbox Code Playgroud)

小智 11

您的代码在发送后尝试发送响应。检查以下几行,在 if 和 else 中,您已经向服务器发送响应,处理完毕后,在最后一行,您正在发送一些文本。

   if (titulo && director && year && rating) {
        res.json(movies);
    } else {
        res.status(500).json({error: 'Ha Ocurrido un error'});
    }
    res.send('recibido');
Run Code Online (Sandbox Code Playgroud)

更新您的代码如下,

router.post('/', (req, res) => {
    const {titulo, director, year, rating} = req.body;
    if (titulo && director && year && rating) {
        const id = movies.length + 1;
        const newMovie = {...req.body, id};
        movies.push(newMovie);
        res.json(movies);
    } else {
        res.status(500).json({error: 'Ha Ocurrido un error'});
    }
   // res.send('recibido');
});

module.exports = router;
Run Code Online (Sandbox Code Playgroud)


小智 5

在 if-else 块之后,您再次尝试发送响应。通过return在每个块中发送响应后放置,您可以解决您的问题或其他简单的方法,只需注释res.send("recibido")。简单的方法就是评论res.send("recibido")

你可以这样写你的代码:

router.post('/', (req, res) => {
const {titulo, director, year, rating} = req.body;
if (titulo && director && year && rating) {
    const id = movies.length + 1;
    const newMovie = {...req.body, id};
    movies.push(newMovie);
    res.json(movies);      
} else {
    res.status(500).json({error: 'Ha Ocurrido un error'});        
}
   // res.send('recibido');
});

module.exports = router;
Run Code Online (Sandbox Code Playgroud)