我正在运行一个带有节点/打字稿和express/express验证器的API服务器,并且在某个地方找到了我真正喜欢的这段代码,将我的路由逻辑与创建路由器分开:
function createRouter(route: Array<RouteEntry>): Router {
const router = Router();
route.forEach((subRoute: RouteEntry) => {
(router as any)[subRoute.method](
subRoute.route,
...subRoute.validation,
async (req: Request, res: Response, next: NextFunction) => {
let data = validationResult(req);
let response = await subRoute.action(data, req, res);
}
);
});
return router;
}
所以你向这个函数传递一个 RouteEntry 的数组:
export type RouteEntry = {
method: string;
route: string;
action: (data: Record<string, any>, req?: Request, res?: Response) => any;
validation: Array<Middleware & ContextRunner>;
};
我不明白的是(请原谅我的 Typescript 深度有限):
route.forEach((subRoute: RouteEntry) => {
(router as any)[subRoute.method](...);
显然它可以工作并将路由添加到路由器堆栈,但我不明白打字稿如何知道这样做?根据我的简单理解,我期望某种分配,例如 Router[subRoute.method] = ...
任何提示将不胜感激...
显然有一系列路由定义,如下所示:
const newRoutes = [
{method: "get", route: "/viewitem", validation: [], action: viewItem},
{method: "get", route: "/list"}, validation: [], action: list
{method: "post", route: "/newitem", validation: [checkData], action: createNewItem}
];
相关代码迭代此数组,并为数组中的每个对象注册一个 Express 路由处理程序,从数组中的每个对象获取方法、路径、任何验证处理程序和 RouteHandler 函数。