Это проблема безопасности или производительности для автоматического добавления контроллеров в маршрутизатор (устранение необходимости в маршрутизации)? - PullRequest
1 голос
/ 01 марта 2020

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

формат выглядит следующим образом:

const controller1 = {
    endpoint: '/hello/world',
    method: 'get',
    controller: () => console.log('hello world!'),
  }

export default [
  controller1
];

Код маршрутизации, который обрабатывает все это, существует в файле rout.ts и выглядит следующим образом:

import glob from 'glob';
import path from 'path';
import { Router } from 'express';
import { toArray } from '../lib/utilities/generic-utilities';
import { isRouteType, isArrayWithContent } from '../lib/utilities/type-checking';
import { skip } from '../lib/middleware/generic-middleware';
import { Route } from '../meta/@types/common-types';
import { secureRoutesConstant, extension } from './settings';
import secureRoute from '../lib/middleware/secure-route';

const router: any = Router({ mergeParams: true });

// relative path from routes file to controllers folder.
const controllersPath = '../http/controllers/';

const addRouteToRouter = (route: Route, filename: string) => {
  const acceptableRoute: object | boolean = isRouteType(route);
  const message: string = `issue with route while exporting a controller in file ${filename}\nroute supplied was:`;

  if (!acceptableRoute) console.log(message, route);
  if (!acceptableRoute) return;

  const { endpoint, controller, method, isSecure = secureRoutesConstant } = route;
  const { middlewareBefore = [], middlewareAfter = [] } = route;

  const makeRouteSecure: Function = isSecure ? secureRoute : skip;
  const middlewareBeforeArr: Function[] = toArray(middlewareBefore);
  const middlewareAfterArr: Function[] = toArray(middlewareAfter);

  const routeArguments: Function[] = [
    ...middlewareBeforeArr,
    makeRouteSecure,
    controller,
    ...middlewareAfterArr,
  ];

  router.route(endpoint)[method](...routeArguments);
};

const addToRouterForEach = (allRoutes: Route[], filename: string) =>
  allRoutes.forEach((route: Route) => addRouteToRouter(route, filename));

glob
  .sync('**/*.ts', { cwd: path.join(`${__dirname}/`, controllersPath) })
  .filter((filename: string) => filename.split('.').includes('controller'))
  .map((filename: string) => ({ defaultsObj: require(`${controllersPath}${filename}`), filename }))
  .filter(({ defaultsObj }) => isArrayWithContent(defaultsObj.default))
  .forEach(({ defaultsObj, filename }) => addToRouterForEach(defaultsObj.default, filename));

export default router;

И просто импортируется в app.ts и используется следующим образом:

app.use('/api', router)

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

Есть ли какие-либо проблемы с производительностью или безопасностью при выполнении подобных действий или с самим кодом?

1 Ответ

1 голос
/ 02 марта 2020

Существуют ли проблемы с производительностью или безопасностью при выполнении подобных операций или с самим кодом?

Производительность

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

Безопасность

Архитектура кода сама по себе безопасна и не увеличивает риск уязвимости.

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