机架中间件:使用和 运行 构造
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?
当你说 use
将 Shrimp
添加到中间件堆栈时你是对的,但 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
我正在阅读有关机架中间件的 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?
当你说 use
将 Shrimp
添加到中间件堆栈时你是对的,但 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