【问题标题】:Rack Middleware in Rack Middleware?机架中间件中的机架中间件?
【发布时间】:2016-07-15 08:20:02
【问题描述】:

我正在尝试构建一个使用机架中间件本身 (RackWired) 的机架中间件 GEM

我有一个现有的应用程序,其 config.ru 使用 Rack::Builder。在那个块 (Rack::Builder) 中,我想指定我的中间件,并且当它被调用以在我自己的内部使用第三方中间件 (rack-cors) 来做一些事情时。我知道很困惑。

问题在于 Rack::Builder 的上下文位于 config.ru 中,因此我的中间件 (RackWired) 无法访问它以“使用”第三方中间件 (rack-cors)。

我努力的目的是here

有没有办法在中间件中使用中间件?

谢谢

【问题讨论】:

    标签: ruby rack middleware


    【解决方案1】:

    是的,我不完全确定您要做什么。但是你可以这样做

    class CorsWired
      def initialize(app)
        @app = app
      end
    
      def call(env)
        cors = Rack::Cors.new(@app, {}) do
          allow do
            origins '*'
            resource '*', :headers => :any, :methods => [:get, :post, :put, :options, :delete], :credentials => false
          end
        end
        cors.call(env)
      end
    end
    

    您的 config.ru 应该有 use CorsWired,而不是 use CorsWired.new

    这就是我想你要问的,但我认为你错过了中间件的意义。您应该根据您的需要更改您的 config.ru 以在中间件之前/之后使用 rack-cors。

    require 'rack'
    require 'rack/cors'
    require './cors_wired'      
    
    app = Rack::Builder.new  do
      use Rack::Cors do
        allow do
            origins '*'
            resource '*', :headers => :any, :methods => [:get, :post, :put, :options, :delete], :credentials => false
          end
        end
      use CorsWired
      run lambda { |env| [200, {'Content-Type' => 'text/plain'}, ['OK']] }  
    end
    run app
    

    【讨论】:

    • 谢谢,这是我要找的第一部分。我可以很容易地完成后者,但我希望为 CORS 添加一些元配置,从而将其拉入 Gem。
    • 我会对该代码进行改进,因为如果没有初始化 Rack::Cors.new(@app, {}) do blah blah end 会出现语法错误
    猜你喜欢
    • 1970-01-01
    • 2011-01-16
    • 2015-06-16
    • 2023-03-22
    • 2014-05-26
    • 1970-01-01
    • 2011-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多