Исключение при перенаправлении в Nest JS Guard - Ошибка [ERR_HTTP_HEADERS_SENT]: невозможно установить заголовки после их отправки клиенту - PullRequest
0 голосов
/ 31 января 2020

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

У меня есть контроллер, который обслуживает мою страницу HTML, которая находится ниже:

@Get()
      @UseGuards(MyGuard)
      root(@Res() res): void {
        return res.sendFile(
          path.resolve(
            '../dist/index.html'
          )
        );
      }

Этот маршрут защищен охранником, который, в свою очередь, приводит меня к URL-адресу перенаправления, который выдает мне токен, и мне потребуется установить этот токен как повар ie в моем ответе. Идея состоит в том, чтобы заблокировать неавторизованного пользователя от просмотра приложения через эту защиту и перенаправить пользователя на страницу ошибки

Логотип Guard c выглядит следующим образом:

@Injectable()
    export class MyGuard implements CanActivate {
      constructor() {}
      canActivate(context: ExecutionContext): boolean {
        const req = context.switchToHttp().getRequest();
        const res = context.switchToHttp().getResponse();
        const cookie = this.getookie(req);
        if (cookie found in cookie and is valid) {
          return true;
        }
        else if (token available in redirect url) {
          res.cookie('token', req.query['token']);
          return true;
        } 
        else if (token not available in route path) {
          const myRedirectionUrl = createRedirectionUrl(req);
          **// Error in below snippet
          res.writeHead(302, {
            Location: myRedirectionUrl  // <-- does some validation and redirects to url with token query string
          });
          res.end()**
        }
        else {
           return false
        } 
      }
    }

Хотя я получаю токен запроса, я могу установить cook ie, и поток работает, как и ожидалось, я всегда получаю исключение по res .writeHead (), который вызывается при первом запросе (который не содержит параметр cook ie или параметр запроса).

(узел: 26764) UnhandledPromiseRejectionWarning: Ошибка [ERR_HTTP_HEADERS_SENT]: невозможно установить заголовки после того, как они отправлены клиенту

на ServerResponse.setHeader (_http_outgoing. js: 470: 11)
на ServerResponse.header (C: \ project \ node_modules \ express \ lib \ response . js: 771: 10)
в ServerResponse.send C: \ project \ node_modules \ express \ lib \ response. js: 170: 12)
в ServerResponse. json (C: \ project \ node_modules \ express \ lib \ response. js: 267: 15)
в ExpressAdapter.reply (C: \ project \ node_modules@nestjs \ platform-express \ adapters \ express адаптер. js: 23: 57)
в ExceptionsHandler.catch (C: \ project \ node_modules@nestjs \ core \ exceptions \ base-exception-filters er. js: 41: 24)
at ExceptionsHandler.next (C: \ project \ node_modules@nestjs \ core \ exceptions \ exceptions-handler. js: 15: 20)
at C: \ project \ node_modules@nestjs \ core \ router \ router-proxy. js: 12: 35
at process._tickCallback (внутренний / process / next_tick. js: 68: 7)
(узел: 26764) UnhandledPromiseRejectionWarning: необработанное отклонение обещания

Любые входные данные должны быть очень полезны !!

...