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

问题描述 投票:0回答:5

我对 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;

CMD 错误

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

邮递员标题:

Content-Type: application/json
node.js json express content-type
5个回答
8
投票

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

   if (titulo && director && year && rating) {
        res.json(movies);
    } else {
        res.status(500).json({error: 'Ha Ocurrido un error'});
    }
    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;

3
投票

在 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;

2
投票

如果您想要 if else 逻辑,请对 res.json、res.status 和 res.send 使用 return 语句。

我在代码中遇到上述错误只是为了意识到无论我在哪里有逻辑语句,在某些情况下代码继续运行并需要返回结果,例如 return res.status(400).send("Error Message)


0
投票

我通过返回找到了错误的答案,但我不知道这个解决方案有多正确

const isAdmin = async (req, res, next) => {
  if (req.isAuthenticated() && req.user.role === "admin") {
    return next()
  } else {
    req.flash("danger", "not allowed")
    res.redirect("/")
  }
  return next()
}

0
投票

对我来说,我使用异步/等待请求和响应处理程序来克服错误。是这样的:

router.post("/", async (req,res)=>{
   await myFunc(val1,val2).then(()=>{
    res.send("success")
   )
   .catch((err)=>{
    res.send(err)
   )
})
© www.soinside.com 2019 - 2024. All rights reserved.