メインの後にラックミドルウェアを使用できますか?
概要
ラックのミドルウェアの順序がどのように機能するかを理解しようとしています。このミドルウェアを持っています
class Middleware1
def initialize(app)
@app = app
end
def call(env)
puts "Middleware 1 start"
status, headers, body = response = @app.call(env)
puts "Middleware 1 to return"
response
end
end
そして私はメインアプリケーションの後にそれを呼び出しています
require_relative "lib/middleware1"
class MyApp
def call(env)
puts "main calling"
[200, {}, ["Hello World"]]
end
end
run MyApp.new
use Middleware1
main が戻った後、Middleware1 は実行されないと思いました。ただし、出力にはミドルウェアが最初に呼び出されることが示されています。ここにログがあります
Middleware 1 start
main calling
Middleware 1 to return
なぜ Middleware1 が最初に呼び出されるのですか?何か特別な理由があるのでしょうか?ありがとう
解決策
ミドルウェアは、アプリケーションとクライアントの間に存在する層です。
クライアント、アプリケーション、およびそのミドルウェア間の通信フローは次のとおりです。
┌────────────┐ ┌────────────┐ ┌─────────────┐
│ ├──1──▶│ ├──2──▶│ │
│ Client │ │ Middleware │ │ Application │
│ │◀──4──┤ │◀──3──┤ │
└────────────┘ └────────────┘ └─────────────┘
つまり、ミドルウェアは実際にはアプリケーションのラッパーであり、アプリケーションの前だけでなくアプリケーションの後でも実行されます。
これには、受信および転送されたリクエスト、アプリケーションによって返された応答、および実際にクライアントに返された応答を読み取りおよび/または操作するための完全なアクセス権があります。