Techioz Blog

メインの後にラックミドルウェアを使用できますか?

概要

ラックのミドルウェアの順序がどのように機能するかを理解しようとしています。このミドルウェアを持っています

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──┤             │
    └────────────┘      └────────────┘      └─────────────┘

つまり、ミドルウェアは実際にはアプリケーションのラッパーであり、アプリケーションの前だけでなくアプリケーションの後でも実行されます。

これには、受信および転送されたリクエスト、アプリケーションによって返された応答、および実際にクライアントに返された応答を読み取りおよび/または操作するための完全なアクセス権があります。