このドキュメントはAIによって翻訳されました。不正確な情報については、英語版をご参照ください
NocoBase Serverのミドルウェアは、本質的にKoaのミドルウェアです。Koaと同様にctxオブジェクトを操作して、リクエストとレスポンスを処理できます。しかし、NocoBaseは異なるビジネス層のロジックを管理する必要があるため、すべてのミドルウェアをまとめてしまうと、保守や管理が非常に困難になります。
このため、NocoBaseではミドルウェアを4つの階層に分けています。
データソースレベルのミドルウェア:app.dataSourceManager.use()
特定のデータソースへのリクエストにのみ作用します。そのデータソースのデータベース接続、フィールド検証、トランザクション処理などのロジックによく使われます。
リソースレベルのミドルウェア:app.resourceManager.use()
定義済みのリソース(Resource)にのみ適用され、データ権限やフォーマットなどのリソースレベルのロジック処理に適しています。
権限レベルのミドルウェア:app.acl.use()
権限チェックの前に実行され、ユーザーの権限やロールの検証に使われます。
アプリケーションレベルのミドルウェア:app.use()
すべてのリクエストで実行され、ログ記録、一般的なエラー処理、レスポンス処理などに適しています。
ミドルウェアは通常、プラグインのloadメソッド内で登録されます。例えば次のようになります。
ミドルウェアの実行順序は次のとおりです。
acl.use()で追加された権限ミドルウェアが実行されます。resourceManager.use()で追加されたリソースミドルウェアが実行されます。dataSourceManager.use()で追加されたデータソースミドルウェアが実行されます。app.use()で追加されたアプリケーションミドルウェアが実行されます。ミドルウェアの実行順序をより柔軟に制御するために、NocoBaseではbefore、after、tagの各パラメーターを提供しています。
例:
位置が指定されていない場合、新しく追加されたミドルウェアのデフォルトの実行順序は次のとおりです。
acl.use() -> resourceManager.use() -> dataSourceManager.use() -> app.use()
ミドルウェアの実行順序は、Koaのオニオンモデルに従います。これは、ミドルウェアスタックに最初に入り、最後に終了するというものです。
異なるインターフェースへのアクセスにおける出力順序の例:
通常のHTTPリクエスト:/api/hello
出力:[1,2] (リソースが定義されていないため、resourceManagerとaclミドルウェアは実行されません)
リソースリクエスト:/api/test:list
出力:[5,3,7,1,2,8,4,6]
ミドルウェアは階層順序とオニオンモデルに従って実行されます。
before / after / tag を使用して、実行順序を柔軟に制御できます。