【问题标题】:Why is adding a Rails middleware like this causing endless redirects?为什么添加这样的 Rails 中间件会导致无休止的重定向?
【发布时间】:2021-03-20 19:05:37
【问题描述】:

我正在尝试将一些中间件添加到我正在处理的 Rails 项目中,当我尝试这样做时,它似乎会导致无限循环。

具体来说,我有以下中间件 shell 文件:

# app/middleware/log_data.rb

class LogData
    def initialize(app)
        @app = app
    end

    def call(env)
        # To-do: Write code here.
    end
end

然后我在app 目录下创建了一个新的middleware 目录并将文件放入该目录中。

之后,我在config/application.rb的底部添加了以下内容:

config.middleware.use("LogData")

使用sudo service puma restart重新启动在Vagrant上运行的Puma服务器后,如果我运行rake middleware,我可以看到中间件正确地显示在底部的列表中。

但是,当我尝试刷新网站时,它会因无限循环而失败,并在 Chrome 中显示以下内容:

如果我注释掉config/application.rb 中的config.middleware.use("LogData") 行,那么中间件将从rake middleware 命令列表中消失,网站停止崩溃并正常加载。

我做错了什么?我错过了什么?我想这很简单,但我不确定为什么一个简单的(和空的)shell 中间件文件会导致整个站点崩溃。谢谢。

我应该注意我使用的是 Rails 4.2.11,我知道它很旧,但现在升级不是一个选项。

【问题讨论】:

  • 请展示call(env) 的样子。问题可能就在那里。
  • 我上面写的就是我所拥有的。我试图在继续之前先设置一个外壳,但外壳原样使一切崩溃。我尝试添加一个随机模型提取(如User.find(1)),但这似乎没有什么区别。
  • 让我们将@app.call(env) 放入def call(env)。我会在你检查后添加答案。

标签: ruby-on-rails vagrant middleware puma


【解决方案1】:

您的中间件什么都不做,返回 nil(转换为不完整的服务器响应),并且基本上请求到此结束。它需要返回一些东西([status, headers, response] 的数组,或者调用 env)以允许请求通过中间件链。

# app/middleware/log_data.rb

class LogData
  def initialize(app)
    @app = app
  end

   def call(env)
    # To-do: Write code here.
    
    # this should be at the very end of the method
    @app.call(env)
   end
end

Here 是关于中间件的更多信息。

【讨论】:

  • 你是绝对正确的。我尝试了[status, headers, response][@status, @headers, @response],在这两种情况下都出现了各种错误(可能是因为我没有正确定义这些变量,但@app.call(env) 就像一个魅力。非常感谢。
猜你喜欢
  • 2014-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-16
  • 1970-01-01
  • 2015-01-16
  • 1970-01-01
  • 2017-12-03
相关资源
最近更新 更多