json 错误[错误_HTTP_HEADERS_SENT]:无法设置发送到客户端后的标题-因为没有成功的消息

wkyowqbh  于 2022-11-19  发布在  其他
关注(0)|答案(4)|浏览(130)

我是Rest Apis这个主题的新手,我正在创建一个简单的API,在那里我接收一个包含电影数据的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

Postman 标题:

Content-Type: application/json
mv1qrgav

mv1qrgav1#

您代码试图在发送响应后再发送它请检查以下行,在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;
unhi4e5o

unhi4e5o2#

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

v64noz0r3#

如果if else逻辑是您想要的,则对res.json、res.status和res.send使用return语句。
我在我的代码中遇到了上述错误,只是意识到无论我有一个逻辑语句,在某些情况下,代码继续运行,需要返回结果,例如return res.status(400).send(“错误消息")

8mmmxcuj

8mmmxcuj4#

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

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()
}

相关问题