【问题标题】:Error : Cannot set headers after they are sent to the client错误:在将标头发送到客户端后无法设置标头
【发布时间】:2020-07-11 20:20:30
【问题描述】:

当我点击注册路线时,“req.body”不会获取任何 POST 值,但是,只要在 Postman 上测试相同的代码 - 使用 body raw 方法 - 值就会显示。

const router = require('express').Router();
const bodyParser = require('body-parser');
const Promise = require('bluebird');

router.use(bodyParser.json());
router.use(bodyParser.urlencoded({
  extended: true
}));


const registration = require('./services/registration');

router.get('/', (req, res, next) => {
  res.send('Admin Welcome');
});

router.get('/signup', (req, res, next) => {
  res.render('user/signup');
});

router.post('/signup', (req, res, next) => {
  res.send(req.body);
  registration.registration(req.body);
  .then(ok=>{
    res.redirect('signin')
  })
  .catch(err => {
    res.render('error', {message: err})
  })
})

router.get('/signin', (req, res, next) => {
  res.render('user/signin');
});

original code

【问题讨论】:

  • 欢迎来到stackoverflow!我看到您已经有了答案 - 但您可能应该编辑您的问题以使其更清楚。发布代码图像不是最好的主意 - 您可以包含代码 sn-ps 并突出显示它们的语法(如给出的答案中)。一般来说,您的问题越清晰,您收到的回复和答案就越好。
  • 这是我第一次在堆栈上的经验,我不明白如何编写代码,所以我附上图片,下次我会尝试发布代码
  • 使用return res.send()
  • @MohammadHamza - 您可能还不能编辑,所以我已经为您完成了 - 当您有机会查看已编辑的问题时,您可以查看其格式。我希望这会有所帮助。

标签: node.js json express body-parser


【解决方案1】:
router.post("/signup", (req, res, next) => {
  res.send(req.body);
  registration
    .registration(req.body)
    .then(ok => {
      res.redirect("signin");
    })
    .catch(err => {
      res.render("error", { message: err });
    });
});

res 对象表示 Express 应用在收到 HTTP 请求时发送的 HTTP 响应。在以下链接中,您可以看到为 res 对象公开的所有方法: https://expressjs.com/en/api.html#res

您在路由处理程序开始时使用的方法是:

res.send([body])

并且可以从文档中读取它发送 HTTP 响应。现在您只能发送该响应一次,否则您将收到错误消息:

Error : Cannot set headers after they are sent to the client

您在处理程序中尝试做的是将结果重定向到“登录”页面,之后已经发送带有res.send(req.body) 的响应。

以这条假路线为例:

router.post("/example", (req, res, next) => {
  res.send('1');
  res.send('2');
  res.send('3');
});

与您可能相信的相反,它不会返回值 (1,2,3),但实际上返回值 1 并引发之前描述的错误。

最后要解决您的问题,您需要删除包含res.send(req.body) 的行并仔细检查registration.registration 服务是否正确处理提供的数据,在这种情况下为req.body

【讨论】:

  • 我使用 res.send(req.body) 只是为了查看数据是否到来
  • 我知道您正在使用它进行调试,但是使用res.send 方法是完全错误的。在这种情况下,最好使用console.log 或调试器。
  • 但是我如何解决我的问题...我删除了 res.send 但结果仍然没有出现
  • 再次检查registration.registration 服务是否正确处理提供的数据,以及它实际上是否正确创建了用户。还要检查user/signin 页面是否存在以及是否正确命名。
  • 所有功能正常工作,当我使用邮递员正文 json 方法显示结果但未显示表单案例结果时
猜你喜欢
  • 2019-10-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多