机架中间件:使用和 运行 构造

Rack Middleware: use and run constructs

我正在阅读有关机架中间件的 this 文章。它声明如下:

Rack is more than interface that can be used to talk to web server. It’s used to group and order modules, which are usually Ruby classes, and specify dependency between them. Rack::Builder puts these modules on top of each other, creating stack-like structure of final web application.

所以基本上,我们可以使用 ruby 类 将中间件堆叠在一起。我们只需要对下一个中间件的引用——这让我想起了装饰器设计模式。

我们需要做的就是拥有一个将下一个应用程序(堆栈中的中间件)作为参数的构造函数。其次,我们需要定义一个调用方法,该方法以环境哈希为参数,returns一个状态码、环境哈希和响应体的数组。

这是提供的示例:

# shrimp.rb
class Shrimp
  def initialize(app)
    @app = app       
  end                

  def call(env)      
    @app.call(env)   
  end                
end                  

# config.ru
require 'rack'
require 'rack/lobster'
require 'shrimp'      

use Shrimp            
run Rack::Lobster.new </pre> 

根据 Rack 文档,use 方法将中间件添加到堆栈,运行 方法分派到应用程序。我对这种语法有点困惑。使用将 Shrimp 添加到中间件堆栈并 运行 将 Lobster 实例传递给 Shrimp 构造函数?我对运行这里的作用还是一头雾水

您链接到的文章提到 Rack 附带一个示例应用程序 Lobster 所以是的,首先,这是一个应用程序。

Shrimp class 只是一个 Ruby class 中间件应该这样写。

config.ru 文件中,您需要模块,注册中间件,然后 运行 应用程序。

use adds Shrimp to the middleware stack and run passes Lobster instance into the Shrimp constructor?

当你说 useShrimp 添加到中间件堆栈时你是对的,但 run 不一定将 Lobster 实例传递到 Shrimp构造函数。 run 仅执行 Rack 应用程序并传递 app 实例是 Rack 内部工作的方式。真正的事情发生在您注册中间件的 use 部分。

例如:

# config.ru
require 'rack'
require 'rack/lobster'
require 'shrimp_1'     
require 'shrimp_2'     
require 'shrimp_3'      

use Shrimp_1      
use Shrimp_2      
use Shrimp_3            
run Rack::Lobster.new </pre>

所有三个 Shrimp classes 将按顺序传递给 app(Lobster) 实例,这将由 Rack 本身处理。

你试过这个吗?也许它会有所帮助。 http://guides.rubyonrails.org/rails_on_rack.html#configuring-middleware-stack