Я просматривал некоторые примеры кода для сервера 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 можно использовать для создания анимаций и игр на веб-страницах.
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);
}
};
который является действительным промежуточным программным обеспечением для экспресса. взгляните на функция высшего порядка, шаблон декоратора и закрытия, которые представляют собой одну и ту же концепцию.