我正在尝试在某些请求(其中 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.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