合并 Rack::Builder 和 Rack::Cascade

Combine Rack::Builder and Rack::Cascade

抱歉,如果这个问题与另一个问题重复,但我还没有找到它。

我有一些 Grape APIs(它们是 Rack 应用程序),其中之一(用户 API)使用中间件进行身份验证。

在我的 config.ru 文件中,我通过 Rack::Cascade 将所有 API 组合到一个应用程序中。这是代码:

user_management = Rack::Builder.new {
  use Middleware
  run UserAPI.new
}
app = Rack::Cascade.new [
    user_management,
    ExampleAPI1,
    ExampleAPI2,
    ExampleAPI3
]

问题是每次 API 中的任何一个收到请求时都会调用中间件。

有人对如何仅在用户 API 收到请求时使用中间件有任何建议吗?

这个问题的答案是我必须从 API 中删除资源(例如资源:用户),然后按如下方式使用 Rack::Builder:

app = Rack::Builder.new {
    map '/user' do
        use Middleware
        run ExampleAPI1
    end

    map '/items' do
        run ExampleAPI2
    end

    map '/locations' do
        run ExampleAPI3
    end

    map '/reports' do
        run ExampleAPI4
    end
}

Rack::Cascade 的问题是它会从上到下尝试每个应用程序,直到找到合适的端点