我试图了解机架中间件的顺序如何工作。我有这个中间件
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
首先被调用。这是日志
Middleware 1 start
main calling
Middleware 1 to return
为什么 Middleware1 首先被调用?有什么具体原因吗?谢谢
中间件是位于应用程序和客户端之间的一层。
客户端、应用程序及其中间件之间的通信流程如下:
┌────────────┐ ┌────────────┐ ┌─────────────┐
│ ├──1──▶│ ├──2──▶│ │
│ Client │ │ Middleware │ │ Application │
│ │◀──4──┤ │◀──3──┤ │
└────────────┘ └────────────┘ └─────────────┘
这意味着中间件实际上是应用程序的包装器,它在应用程序之前运行,但也在应用程序之后运行。
它具有读取和/或操作传入和转发的请求、应用程序返回的响应以及实际返回给客户端的响应的完全访问权限。