错误:将标头发送到客户端后无法设置标头

时间:2020-03-31 10:01:42

标签: node.js json express body-parser

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

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

1 个答案:

答案 0 :(得分:0)

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