Как вы вводите асинхронную экспресс-функцию промежуточного программного обеспечения в Typescript? - PullRequest
0 голосов
/ 13 мая 2018

Как определить возвращаемое значение для промежуточного программного обеспечения Express, использующего async / await?Я пробовал несколько разных вещей, но мне не повезло.

Я также пытаюсь перегрузить объект Request, чтобы разрешить определение req.user при декодировании полезной нагрузки JWT.

import { NextFunction, Request, RequestHandler, Response } from 'express'

const authenticate: RequestHandler = async (req: IUserRequest, res: Response, next: NextFunction): Promise<void> => {
  if (! req.headers.authorization) { return next(new ValidationError()) }
  const payload: IUserData = await decodeJwt(req.headers.authorization)
  req.user = payload
  return next()
}

export interface IUserRequest extends Request {
  user: IUserData
}

/* errors 
(req: IUserRequest, res: Response, next: NextFunction) => Promise<void>' is not assignable to type 'RequestHandler'.
  Types of parameters 'req' and 'req' are incompatible.
    Type 'Request' is not assignable to type 'IUserRequest'.
      Property 'user' is missing in type 'Request'.
*/

1 Ответ

0 голосов
/ 13 мая 2018
Типы

Request и IUserRequest несовместимы, поскольку в Request отсутствует user. Вероятно, свойство не отображается в req до тех пор, пока оно ему не назначено.

Должно быть:

export interface IUserRequest extends Request {
  user?: IUserData
}
...