ルーターにコントローラーを自動的に追加する(ルーティングの必要性をなくす)ことは、セキュリティまたはパフォーマンスの問題ですか?

ステファノ

したがって、これを処理するコードを記述しました。基本的に、プロジェクト内のplaceholder.controller.tsファイルを検索し、エクスポートされたコントローラーの配列を使用してルーティングを追加します。コントローラは、デフォルトで特定の形式の配列にエクスポートする必要があります。

形式は次のようになります。

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

export default [
  controller1
];

これらすべてを処理するルーティングコードは、routes.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秒かかる場合でも、個々のクライアント要求ルート処理に支払うコストではありません。

セキュリティ

コードアーキテクチャはそれ自体で安全であり、脆弱性のリスクを高めることはありません。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ