Оболочка для асинхронных обработчиков в Express с пользовательскими свойствами запроса - PullRequest
0 голосов
/ 21 сентября 2018

Как показано на https://strongloop.github.io/strongloop.com/strongblog/async-error-handling-expressjs-es7-promises-generators/#using-es7-asyncawait, Я хотел использовать оболочку для всех моих обработчиков async Express, чтобы перехватывать любые ошибки, происходящие там, но в типизированной версии для TypeScript.

Я придумал это: (wrap.ts)

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

type AsyncRequestHandler = (req: Request, res: Response, next: NextFunction) => Promise<any>;

/**
 * Catches errors and passes them to the next callback
 * @param handler Async express request handler/middleware potentially throwing errors
 * @returns Async express request handler with error handling
 */
export default (handler: AsyncRequestHandler): RequestHandler => {
  return (req, res, next) => {
    return handler(req, res, next).catch(next);
  };
};

Я хочу создать REST API с некоторыми конечными точками, такими как PUT /users/:userId и DELETE /users/:userId.Для удобства я не хочу запрашивать конкретного пользователя с идентификатором userId из базы данных в каждом обработчике и вместо этого сохранять его в req с использованием промежуточного программного обеспечения.Это означает, что я должен использовать модифицированный интерфейс Request для определения обработчика, добавляя свойство user, например, UserRequest.

import express, { Request } from 'express';
import wrap from './wrap';

const app = express();

app.use('/users/:userId', wrap(async (req, res, next) => {
  // set req.user ...
}));

export interface UserRequest extends Request {
  user: User;
}

app.put('/users/:userId', wrap(async (req: UserRequest, res) => {
  // do something with req.user ...
}));

// ...

Это было бы возможно, если не используется wrap, но нес этим определением типа wrap.Компилятор TypeScript выдает следующую ошибку:

Argument of type '(req: UserRequest, res: Response) => Promise<void>' is not assignable to parameter of type 'AsyncRequestHandler'.
  Types of parameters 'req' and 'req' are incompatible.
    Type 'Request' is not assignable to type 'UserRequest'.
      Property 'user' is missing in type 'Request'.

Что такое «способ TypeScript» для этого?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...