ruby中间件添加堆栈添加middlware



我正试图在某些请求(其中request.path=="/hi")的堆栈中添加/附加中间件(在config.ru中)

我试着用Rack::Builder 来做到这一点

但我似乎失败了。

Rack::Builder.new do
use added_middleware1
use added_middleware2
end.call(@env) if @request.path == "/something"

我不确定这是否能让我的问题变得清楚。

@request变量应该只有在实际请求发生时才可用,但您发布的代码可能在服务器启动时的配置时间运行。Rack::Builder文档的首页上有一个示例代码,显示了如何执行您想要的操作:

app = Rack::Builder.new {
use Rack::CommonLogger
use Rack::ShowExceptions
map "/lobster" do
use Rack::Lint
run Rack::Lobster.new
end
}

堆栈应该更像这样:

use CommonMiddleware
map '/something' do
use SpecialMiddleware
run TheApp.new
end
map '/' do
run TheApp.new
end

或者,您可以编写一个中间件来查看请求路径,并根据需要运行其他特殊的中间件-有点像它的包装器

def initialize app, special_middleware
@app, @special_middleware = app, special_middleware
end
def call env
if route_matches?(env)
@special_middleware.new(@app).call(env) # assumes special_middleware initializer takes no extra parameters
else
@app.call(env)
end
end
def route_matches? env
# examine the rack environment hash, return true or false
end

使用它的配置如下:

use RouteMatchingMiddleware, SpecialMiddleware
run TheApp.new

最新更新