我对 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
您的代码在发送后尝试发送响应。 检查以下几行,在 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;
在 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;
如果您想要 if else 逻辑,请对 res.json、res.status 和 res.send 使用 return 语句。
我在代码中遇到上述错误只是为了意识到无论我在哪里有逻辑语句,在某些情况下代码继续运行并需要返回结果,例如 return res.status(400).send("Error Message)
我通过返回找到了错误的答案,但我不知道这个解决方案有多正确
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()
}
对我来说,我使用异步/等待请求和响应处理程序来克服错误。是这样的:
router.post("/", async (req,res)=>{
await myFunc(val1,val2).then(()=>{
res.send("success")
)
.catch((err)=>{
res.send(err)
)
})