我在 GitHub 上浏览 Express 服务器的一些代码示例,发现了这个用于包装 REST API Controller 的函数,并且对它的工作原理感到困惑...
import { RequestHandler } from 'express';
export const catchErrors = (requestHandler: RequestHandler): RequestHandler => {
return async (req, res, next): Promise<any> => {
try {
console.log(req.body) **// returns requestHandler's req parameter //**
return await requestHandler(req, res, next);
} catch (error) {
next(error);
}
};
};
它用于包装 REST API Controller 以捕获错误并将其传递到错误处理中间件。此类用法的一个简短示例如下:
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 Controller 回调。然而,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
最佳答案
catchErrors
只是一个辅助函数,用于从另一个中间件函数返回一个中间件函数,从而增强或添加功能。在您的情况下,请将 fetchData
视为
async (req, res, next): Promise<any> => {
try {
console.log(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);
}
};
这是一个有效的 Express 中间件。看看higher order function , decorator pattern和 closures这是相同的概念。
关于javascript - 这个接受 Express 中的 RequestHandler 的函数是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72217932/