したがって、これを処理するコードを記述しました。基本的に、プロジェクト内の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]
コメントを追加