Как работает эта функция, которая принимает RequestHandler в экспресс-режиме?

Я просматривал некоторые примеры кода для сервера Express на GitHub и наткнулся на эту функцию, используемую для обертывания контроллеров REST API, и не понял, как она работает...

import { RequestHandler } from 'express';

export const catchErrors = (requestHandler: RequestHandler): RequestHandler => {
  return async (req, res, next): Promise<any> => {
    try {
      console.info(req.body) **// returns requestHandler's req parameter //**

      return await requestHandler(req, res, next);
    } catch (error) {
      next(error);
    }
  };
};

Он используется для обертывания контроллеров REST API, чтобы перехватывать ошибки и передавать их промежуточному программному обеспечению для обработки ошибок. Вот краткий пример такого использования:

import {catchErrors} from './error'
export const fetchData = catchErrors(async (req: Request, res: Response) => {
  /// perform data fetching here ///
  return res.status(200).send()

})

Я не понимаю, как работает функция catchErrors. Насколько я понимаю, параметр requestHandler относится к исходному обратному вызову контроллера REST. Однако следующая часть catchError, где говорится return async (req, res, next): Promise<any> => {...} Откуда это (req, res, next)? Я попытался зарегистрировать в консоли req.body, и оказалось, что это тело запроса параметра requestHandler, проанализированного выше. Я не понимаю, как можно ссылаться на requestHandler (req, res, next) таким образом, вместо того, чтобы, скажем, requestHandler.req (что не работает)?

Ссылка на GitHub, где я нашел этот код: https://github.com/oldboyxx/jira_clone/blob/master/api/src/errors/asyncCatch.ts

🤔 А знаете ли вы, что...
JavaScript можно использовать для создания анимаций и игр на веб-страницах.


2
29
1

Ответ:

Решено

catchErrors — это просто вспомогательная функция для возврата функции промежуточного программного обеспечения из другой функции промежуточного программного обеспечения, улучшения или добавления функций. в вашем случае подумайте о fetchData как

 async (req, res, next): Promise<any> => {
    try {
      console.info(req.body) **// returns requestHandler's req parameter //**

      const fetchFunction = async (req: Request, res: Response) => {
           /// perform data fetching here ///
           return res.status(200).send()

      }
      return await fetchFunction(req, res, next);
    } catch (error) {
      next(error);
    }
  };


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