Типы безопасного экспресс-промежуточного программного обеспечения и маршрутов?

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

authenticateJwt = (
  req: RequestWithToken,
  res: Response,
  next: () => void
) => {
// Append the decoded req.token to the req header so we can use it internally
const token = req.token;

// @ts-ignore
this.verifyJwt(token)
  .then((decoded: Token) => {
    req.token = decoded;
    next();
  })
  .catch(() => res.status(401).send('Unauthorized'));
};

теперь в моем routes.ts:

router.get(
  '/me',
  // @ts-ignore
  jwtService.authenticateJwt,
  userController.getProfileFromUser
);

Я должен написать // @ ts-ignore, потому что он говорит, что '(req: RequestWithToken, res: Response, next: () => void) => void не относится к типу RequestHandlerParams

определение RequestWithToken:

export interface RequestWithToken extends Request {
  token: Token;
}
export interface Token {
  username: string;
}
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
759
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ты пытался :

const token = req.token as Token;

Если я использую req: Request и то, что вы написали, то там говорится, что req.token не существует для типа Request.

Michel Vorwieger 15.01.2019 10:42

@MichelVorwieger Я забыл, вам также нужно повторно ввести свой интерфейс запроса, как в stackoverflow.com/questions/37377731/…

Rohit Gupta 15.01.2019 10:48

теперь он работает в моем промежуточном программном обеспечении, но экспресс-маршрутизатор все еще жалуется, что (req: Request, res: Response, next: () => void) => void не относится к типу RequestHandlerParams

Michel Vorwieger 15.01.2019 11:26

Я исправил это, также перезаписав объект Request из express-serve-static-core

Michel Vorwieger 15.01.2019 11:47

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

Rohit Gupta 15.01.2019 11:53
Ответ принят как подходящий

создать custom.d.ts и перезаписать интерфейс Requestexpress и express-serve-static-core

declare module 'express' {
  interface Request {
    token: Token;
  }
}

declare module 'express-serve-static-core' {
    interface Request {
        token: Token;
    }
}

таким образом и RequestHandlerParams (обычно ваш контроллер), и RequestHandler (обычно ваше промежуточное ПО) получают ваш новый интерфейс Request.

затем добавьте его в раздел files вашего tsconfig.json:

"files": [
    "src/custom.d.ts"
]

Другие вопросы по теме