Невозможно установить заголовки после отправки клиенту сообщения об ошибке.Почему я получаю это сообщение? - PullRequest
0 голосов
/ 21 ноября 2018

Я смущен этим сообщением об ошибке, и я не уверен, как отлаживать.Я посмотрел на похожие вопросы и думаю, что нашел часть кода, которую нужно исправить, но я не уверен, как это сделать.

Вот код -

app.post('/sign_up_results', function(req, res, next) {
    if (req.body.administrator === 'on') {
        data = {name : req.body.name, password: req.body.password, user: 'administrator'};
        pool.query('INSERT INTO users SET ?', data, function(err, result) {
        // If I omit this if statement it works fine
            if (err) {
                next(err);
                return;
            }
        });  
        res.render('review_papers');
    } else if (req.body.user === 'on') {
        data = {name : req.body.name, password: req.body.password, user: 'user'};
        pool.query('INSERT INTO users SET ?', data, function(err, result) {
        // If I omit this if statement it works fine
            if (err) {
                next(err);
                return;
            }
        });  
        res.render('upload_paper');
    }
});    

1 Ответ

0 голосов
/ 22 ноября 2018

Вы должны быть особенно осторожны с функцией обратного вызова pool.query.В старых кодах

data = {
  name: req.body.name,
  password: req.body.password,
  user: 'administrator'
};
pool.query('INSERT INTO users SET ?', data, function (err, result) {
  // If I omit this if statement it works fine
  if (err) {
    next(err);
    return;
  }
});
res.render('review_papers');

res.render будет выполнено первым, чем pool.query.Итак, в основном вы уже говорите, что запрос выполняется без ожидания pool.query для завершения.

Через несколько секунд pool.query закончен.Ваша проблема в том, что в вашем запросе обнаружена ошибка, поэтому он перейдет к next(err), который также говорит о том, что ваш запрос выполнен.Это неверно, потому что вы не можете сказать, что запрос выполнен более одного раза.Это вызывает Cannot set headers after they are sent to the client error message.

Простой обходной путь - переместить res.render внутрь pool.query, например

pool.query('INSERT INTO users SET ?', data, function (err, result) {
  // If I omit this if statement it works fine
  if (err) {        
    return next(err); // we can just return here
  }

  res.render('review_papers');
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...