この記事は、特定の基礎を備えた Node.js 開発者向けの記事です。
難易度
中
バックグラウンド
今日はノード バックエンドのルーティングの問題について話しましょう。 [関連チュートリアルの推奨事項: nodejs ビデオ チュートリアル
]ログインインターフェースrouter.post('/user/login', user.login);
ユーザー情報の取得インターフェース
router.get ('/user/info', checkAuth, user.xxx);
この書き方は非常に一般的で、最初にルートを登録し、後で実行するミドルウェアのメソッドを指定します。
しかし、インターフェイスが増えていくと、たとえばインターフェイスが 1,000 個になると、このように 1,000 回登録する必要があり、インターフェイスの数が増えると、非常に面倒で面倒なことになると思います。
##koa&express ルーティングの登録例const express = require('express');
const router = express.Router();
const user = require('../../controllers/user');
const tokenCheck = require('../../middleware/token_check_api');
//用户注册
router.post('/user/register', user.register);
//用户登录
router.post('/user/login', user.login);
router.post('xxx', tokenCheck, user.xxx);
...假装还有有1000个
eggjs ルート登録例'use strict';
// egg-router extends koa-router
import { Application } from 'egg';
export default (app: Application) => {
const { router, controller, middleware } = app;
router.get('/', middleware.special(), controller.home.index);
router.get('/1', middleware.special(), controller.home.index1);
....
router.get('/error', controller.home.error);
};
**この種のプロジェクトが拡大すると、この構成は非常に冗長に見えると思うので、ルートの自動読み込み機構を実装する必要があります。それを改善し、最適化するためです。
1. 効率の向上
2. よりエレガントな記述
共通ルートの自動読み込み問い合わせてみたところ、いくつかのフレームワークは、さまざまな方法でルートの自動読み込みを実装しています。
1. think シリーズ
最初のシリーズは thinkPHP と thinkjs、参考リンクthinkjs.org/zh-cn/doc /3…
両者の関係は、thinkjs が thinkPHP の考え方に従って設計、開発されたということです。 他の 2 つのルートの自動読み込みはファイルベースです。つまり、コントローラー名とメソッド名を書き込んだ後は、追加の構成を行わずにルートに直接アクセスできます。
1. Thinkphp のルーティングは自動的にロードされますtp はモジュール/コントローラー/メソッドのファイル名に従って自動的にロードされます module?/controller/Action
たとえば、 Adminモジュールに続きます 次に、AdlistController.class.phpのindexメソッド
彼のルートは、
## としてロードされます。 #コントローラ ファイルの自動ロード ロジック
1)、アプリケーションの初期化、インスタンスの作成....
2)、コントローラ ディレクトリのトラバース、コントローラのロードディレクトリ ファイルに対応するエクスポートされたクラスのマップを取得します。
たとえば、Controller ディレクトリ内で
彼はモジュール、コントローラー、メソッドをロードし、アプリにハングします。
{ '/order': [class default_1 extends default_1], '/user': [class default_1 extends default_1] }
3. コントローラーのマッチング部分
前のステップは、thinkjs アプリケーションの起動フェーズ中に実行されます。
このステップ コントローラーのマッチング部分 は、リクエストが受信されたときに実行されることです。
つまり、リクエストが来ると、それが最初に通過し、Think-router はモジュール、コントローラー、アクションを解析して ctx にハングします。
ここでは、ctx 上のこのリクエストのモジュール、コントローラー、アクションを取得し、起動時にアプリにハングしているモジュール、コントローラー、アクション、リストと照合し、存在する場合はそれを実行します。 think-controller のマッチング ロジックの詳細については、
1. think-router が解析した後、think-controller はマッチングを実行します。これは動的マッチングです。
2. koa-router がルートと一致した後、koa-compose を使用して小さなオニオン リングを組み立てて! 私の理解では、プログラムの開始時にシーケンスが登録されると理解しています image.png
#概要: thinkjs は最初にコントローラーとメソッドを読み込み、最後にリクエストが到着すると、think-controller
#デコレータは Java spring のアノテーションと同様に記述されます node框架中 1、 控制器装饰器 @controller('/order') 2、方法装饰器 @Get('/export')、 @Post('/list') get接口 就是 post的接口 就是 3、装饰器路由统一注册 这里统一按egg的方法循环注册路由 通过如上比较,相信你对think系列框架堵文件的路由自动加载和装饰器的路由加载,有了一定了解, 还有我认为装饰器的路由写起来,比较优雅, 不知道各位小伙伴怎么看,评论区说说? 更多node相关知识,请访问:nodejs 教程!nestjs
和midwayjs
已经全面拥抱了装饰器路由。
home.ts
,
那你控制器注册也写 @controller('/home')
来保持一致。'use strict';
import { Context } from 'egg';
import BaseController from './base';
import { formatDate } from '~/app/lib/utils';
import { SelfController, Get } from './../router'
@SelfController('/home')
export default class HomeController extends BaseController {
[x: string]: any;
@validate()
@Get("/")
public async index(): Promise<void> {}
}</void>
@Get()
@Post()
@Get("/")
public async index(): Promise<void> {}
@Post("/update")
public async update(): Promise<void> {}</void></void>
'use strict';
import { Application, Context } from 'egg';
import 'reflect-metadata';
const CONTROLLER_PREFIX: string = '';
const methodMap: Map<string> = new Map<string>();
const rootApiPath: string = '';
interface CurController {
pathName: string;
fullPath: string;
}
/**
* controller 装饰器,设置api公共前缀
* @param pathPrefix {string}
* @constructor
*/
export const SelfController = (pathPrefix?: string): ClassDecorator => (targetClass): void => {
// 在controller上定义pathPrefix的元数据
// https://github.com/rbuckton/reflect-metadata
(Reflect as any).defineMetadata(CONTROLLER_PREFIX, pathPrefix, targetClass);
};
const methodWrap = (path: string, requestMethod: string): MethodDecorator => (target, methodName): void => {
// 路由装饰器参数为空时,路由为方法名
const key = path ? `${requestMethod}·${path}·${String(methodName)}` : `${requestMethod}·${String(methodName)}·/${String(methodName)}`;
methodMap.set(key, target);
};
// Post 请求
export const Post = (path: string = ''): MethodDecorator => methodWrap(path, 'post');
// Get 请求
export const Get = (path: string = ''): MethodDecorator => methodWrap(path, 'get');
export default (app: Application): void => {
const { router } = app;
// 遍历methodMap, 注册路由
methodMap.forEach((curController: CurController, configString: string) => {
// 请求方法, 请求路径, 方法名
const [ requestMethod, path, methodName ] = configString.split(`·`);
// 获取controller装饰器设置的公共前缀
// 如果controller没有添加SelfController装饰器,则取文件名作为路径
let controllerPrefix: string | undefined | null = (Reflect as any).getMetadata(CONTROLLER_PREFIX, curController.constructor);
if (!(Reflect as any).hasMetadata(CONTROLLER_PREFIX, curController.constructor)) {
controllerPrefix = `/${curController.pathName.split(`.`).reverse()[0]}`;
}
const func: (this: Context, ...args: any[]) => Promise<any> = async function (...args: any[]): Promise<any> {
return new (curController.constructor as any)(this)[methodName](...args);
};
// 注册路由
router[requestMethod](rootApiPath + controllerPrefix + path, func);
});
};</any></any></string></string>
建议使用node写服务直接上midwayjs或者nestjs
总结
他们的这种设计思想值得学习吧
, 希望对你有所启发。
以上がNode.js でのバックエンド ルートの自動読み込みに関する簡単な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

さまざまなJavaScriptエンジンは、各エンジンの実装原則と最適化戦略が異なるため、JavaScriptコードを解析および実行するときに異なる効果をもたらします。 1。語彙分析:ソースコードを語彙ユニットに変換します。 2。文法分析:抽象的な構文ツリーを生成します。 3。最適化とコンパイル:JITコンパイラを介してマシンコードを生成します。 4。実行:マシンコードを実行します。 V8エンジンはインスタントコンピレーションと非表示クラスを通じて最適化され、Spidermonkeyはタイプ推論システムを使用して、同じコードで異なるパフォーマンスパフォーマンスをもたらします。

現実世界におけるJavaScriptのアプリケーションには、サーバー側のプログラミング、モバイルアプリケーション開発、モノのインターネット制御が含まれます。 2。モバイルアプリケーションの開発は、ReactNativeを通じて実行され、クロスプラットフォームの展開をサポートします。 3.ハードウェアの相互作用に適したJohnny-Fiveライブラリを介したIoTデバイス制御に使用されます。

私はあなたの日常的な技術ツールを使用して機能的なマルチテナントSaaSアプリケーション(EDTECHアプリ)を作成しましたが、あなたは同じことをすることができます。 まず、マルチテナントSaaSアプリケーションとは何ですか? マルチテナントSaaSアプリケーションを使用すると、Singの複数の顧客にサービスを提供できます

この記事では、許可によって保護されたバックエンドとのフロントエンド統合を示し、next.jsを使用して機能的なedtech SaaSアプリケーションを構築します。 FrontEndはユーザーのアクセス許可を取得してUIの可視性を制御し、APIリクエストがロールベースに付着することを保証します

JavaScriptは、現代のWeb開発のコア言語であり、その多様性と柔軟性に広く使用されています。 1)フロントエンド開発:DOM操作と最新のフレームワーク(React、Vue.JS、Angularなど)を通じて、動的なWebページとシングルページアプリケーションを構築します。 2)サーバー側の開発:node.jsは、非ブロッキングI/Oモデルを使用して、高い並行性とリアルタイムアプリケーションを処理します。 3)モバイルおよびデスクトップアプリケーション開発:クロスプラットフォーム開発は、反応および電子を通じて実現され、開発効率を向上させます。

JavaScriptの最新トレンドには、TypeScriptの台頭、最新のフレームワークとライブラリの人気、WebAssemblyの適用が含まれます。将来の見通しは、より強力なタイプシステム、サーバー側のJavaScriptの開発、人工知能と機械学習の拡大、およびIoTおよびEDGEコンピューティングの可能性をカバーしています。

JavaScriptは現代のWeb開発の基礎であり、その主な機能には、イベント駆動型のプログラミング、動的コンテンツ生成、非同期プログラミングが含まれます。 1)イベント駆動型プログラミングにより、Webページはユーザー操作に応じて動的に変更できます。 2)動的コンテンツ生成により、条件に応じてページコンテンツを調整できます。 3)非同期プログラミングにより、ユーザーインターフェイスがブロックされないようにします。 JavaScriptは、Webインタラクション、シングルページアプリケーション、サーバー側の開発で広く使用されており、ユーザーエクスペリエンスとクロスプラットフォーム開発の柔軟性を大幅に改善しています。

Pythonはデータサイエンスや機械学習により適していますが、JavaScriptはフロントエンドとフルスタックの開発により適しています。 1. Pythonは、簡潔な構文とリッチライブラリエコシステムで知られており、データ分析とWeb開発に適しています。 2。JavaScriptは、フロントエンド開発の中核です。 node.jsはサーバー側のプログラミングをサポートしており、フルスタック開発に適しています。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

mPDF
mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

WebStorm Mac版
便利なJavaScript開発ツール

VSCode Windows 64 ビットのダウンロード
Microsoft によって発売された無料で強力な IDE エディター

EditPlus 中国語クラック版
サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

MantisBT
Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。
