main 之后我们可以有机架中间件吗?

问题描述 投票:0回答:1

我试图了解机架中间件的顺序如何工作。我有这个中间件

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 首先被调用?有什么具体原因吗?谢谢

ruby rack
1个回答
0
投票

中间件是位于应用程序和客户端之间的一层。

客户端、应用程序及其中间件之间的通信流程如下:

    ┌────────────┐      ┌────────────┐      ┌─────────────┐
    │            ├──1──▶│            ├──2──▶│             │
    │   Client   │      │ Middleware │      │ Application │
    │            │◀──4──┤            │◀──3──┤             │
    └────────────┘      └────────────┘      └─────────────┘
  1. 客户端向中间件发送请求。
  2. 中间件可能会运行代码,例如记录或更改请求,然后将请求转发到应用程序。
  3. 应用程序将其响应返回给中间件。
  4. 中间件获取该响应,可能会再次运行其他代码来更改响应,然后将其发送到客户端。

这意味着中间件实际上是应用程序的包装器,它在应用程序之前运行,但也在应用程序之后运行。

它具有读取和/或操作传入和转发的请求、应用程序返回的响应以及实际返回给客户端的响应的完全访问权限。

© www.soinside.com 2019 - 2024. All rights reserved.