Ошибка: невозможно установить заголовки после их отправки из промежуточного ПО - PullRequest
0 голосов
/ 21 мая 2018

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

Информация отправляется конечному пользователю просто отлично, однако я продолжаю видеть эти «не могу установить ошибки заголовка» в консоли узла.Я считаю, что это связано с неправильным использованием функции next ().

Вот мой код:

user.js (маршрутизатор)

router.get('/me', VerifyToken, userController.me_get);

VerifyToken.js (промежуточное ПО)

    module.exports = (req, res, next) => {
    var token = req.headers['authorization'];
    //Check if token used is undefined
    if(typeof token !== 'undefined') {
        jwt.verify(token, 'secretkey', (err, authData) => {
            if(err) {
                return next(res.json({ message : 'You are not authorized to be here'}));
            } else {
                var usertoken = {
                    id : authData.user._id,
                    username : authData.user.username
                }
                res.locals.usertoken = usertoken;
                return next();
            }
          });
        return next();
    } else {
        //Forbidden
        return next(res.sendStatus(403));
    }
}

users.js (контроллер)

module.exports.me_get = (req, res, next) => {
  return res.json({ message : 'You have arrived!', usertoken : res.locals.usertoken });
}

Я просто хочуизбавиться от этого «Ошибка: невозможно установить заголовки после их отправки».в консоли.Любая помощь приветствуется!

Ответы [ 3 ]

0 голосов
/ 21 мая 2018

Не следует звонить .next, если вы заканчиваете запрос.В противном случае он перейдет к следующему промежуточному программному обеспечению, которое снова завершит запрос, и вы получите ошибку Error: Can't set headers after they are sent, поскольку вы не можете завершить запрос дважды.

Заменить:

return next(res.sendStatus(403));

С

return res.sendStatus(403);

А

return next(res.json({ message : 'You are not authorized to be here'}));

С

return res.json({ message : 'You are not authorized to be here'});
0 голосов
/ 21 мая 2018

Оказывается, у меня был дополнительный return next() в нижней части блока if в промежуточном программном обеспечении.

0 голосов
/ 21 мая 2018

Если вы отправляете ответ с res.json() (или любым другим методом, который отправляет ответ), не вызывайте next().next() продолжит обработку другим обработчикам запросов, некоторые из которых могут попытаться отправить другой ответ.Поскольку вы можете отправить только один ответ на запрос, вы получите сообщение об ошибке.

После отправки ответа просто вернитесь.Вся обработка выполняется в этот момент.

Например, замените это:

return next(res.json({ message : 'You are not authorized to be here'}));

на это:

res.json({ message : 'You are not authorized to be here'});
return;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...