TypeScript добавить пользовательский заголовок запроса в Express - PullRequest
0 голосов
/ 21 ноября 2019

Я пытаюсь добавить пользовательский заголовок к моему запросу, но он должен быть изменен / реализован в интерфейсе.

Стандартные Request ссылки на интерфейсы IncomingHttpHeaders. Поэтому я пытаюсь расширить этот интерфейс с помощью собственного заголовка токена.

import { IncomingHttpHeaders } from 'http';

declare module 'express-serve-static-core' {
    interface IncomingHttpHeaders {
        "XYZ-Token"?: string
    }
}

Я обновил файл .tsconfig, чтобы прочитать папку ./types. Имя моего файла: index.d.ts

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

Ошибка

error TS2538: Type 'string[]' cannot be used as an index type.

    req.headers['XYZ-Token']

Если я использую любое из значений исходного интерфейса, все работает нормально.

Пример:

    req.headers['user-agent']

Дополнительная информация : Я использую NestJS, которая использует Fastify / Express под капотом. Я могу подтвердить, что используемый интерфейс запроса от Express. Fastify имеет обратную совместимость со всеми модулями Express. В основном используется Fastify, потому что это быстрее.

Ответы [ 2 ]

0 голосов
/ 21 ноября 2019

Похоже, в объявлении указано неверное имя модуля.

Несмотря на то, что интерфейс IncomingHttpHeaders подключен к объекту Request из express-serve-static-core, исходный источник интерфейса IncomingHttpHeaders фактически является частью пакета http.

Следующее позволило сделать пользовательский заголовок доступным в коде и правильно скомпилировать ts.

import { IncomingHttpHeaders } from 'http';

declare module 'http' {
    interface IncomingHttpHeaders {
        "XYZ-Token"?: string
    }
}
0 голосов
/ 21 ноября 2019

По какой-то причине он считает, что передаваемая вами строка является массивом, но помимо этой точки, если вам нужно установить пользовательский заголовок (а это не динамическое значение), вы можете использовать декоратор @Header(). Если он динамический, то вы можете использовать перехватчик, чтобы захватить ответ перед полетом и установить там заголовок с чем-то вроде

@Injectable()
export class CustomHeaderInterceptor implements NestInterceptor {
  intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
    return next
      .handle()
      .pipe(
        tap(() => context.switchToHttp().getResponse().header('XYZ-Token', customValue),
      );
  }
}
...