Узел / Экспресс: Невозможно установить заголовки после их отправки клиенту - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть код ниже, где я пытаюсь проверить пользователя с его учетными данными из БД Mongo:

{
  validate: async function (email, password, res) {
    console.log('Inside validate method');

    try {
      var dbUserObj = await User.findOne({ email: email }, (err, user) => {

        console.log('Inside validate method111111');

        if (err) {
          return res.status(500).send('Error on the server.');
        }

        console.log('Inside validate method 22222');

        if (!user) {
          return res.status(404).send('No user found.');
        }

        console.log('Inside validate method33333');

        var passwordIsValid = bcrypt.compareSync(password, user.password);

        console.log('Is Valid Password :: ' + passwordIsValid);

        if (!passwordIsValid) {
          return res.status(401).send({
            auth: false,
            token: null
          });
        }
      });
    } catch (e) {

    }

    console.log('DDDDBBBB USSSERRRR :::' + dbUserObj);
    return dbUserObj;
  }
}

Приведенный ниже код вызывает метод проверки:

var auth = {

login: function(req, res,next) {

 console.log('Inside login');
var email = req.body.email || '';
var password=req.body.password || '';
console.log('Before validate user');
// Fire a query to your DB and check if the credentials are valid
var dbUserObj = auth.validate(email,password,res);

if (!dbUserObj) { // If authentication fails, we send a 401 back
  res.status(401);
  res.json({
    "status": 401,
    "message": "Invalid credentials"
  });
  return;
}

if (dbUserObj) {      
  res.send(genToken(dbUserObj));

}

}

При возникновении условия, когда пароль неверный, я получаю сообщение об ошибке:

Ошибка [ERR_HTTP_HEADERS_SENT]: Невозможно установить заголовки после их отправки клиенту

Не могу разобраться в проблеме.

1 Ответ

0 голосов
/ 12 декабря 2018

Маршрут, который вызывает ваш validate(), должен принять параметр next обратного вызова из express, в противном случае платформа предполагает, что когда асинхронная функция вернется (что происходит в первом выражении await), он завершил всю свою работу и в этот момент он продолжает свои маршруты к обработке ошибок по умолчанию, которая отправляет 404, прежде чем ваш запрос к базе данных возобновляет асинхронный поток управления в validate.

Когда ваш обработчик маршрута принимаетПараметр next указывает, что маршрут будет обрабатываться асинхронно, и вы можете сделать 1 из 3 вещей:

  1. Не вызывать next(), если вы уже отправили ответ (который вывсегда выполняйте в этом случае).
  2. Вызовите next() без аргументов, если вы не отправляете ответ и хотите делегировать обработку ответа оставшимся маршрутам.
  3. Вызовите next(error)если вы хотите делегировать обработку ответов оставшемуся промежуточному программному обеспечению, которое будет обрабатывать сообщения об ошибках и ответы за вас.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...