gpt4 book ai didi

ruby-on-rails - 忽略特定 rails route 的 Rack::Timeout 中间

转载 作者:行者123 更新时间:2023-12-04 07:37:21 26 4
gpt4 key购买 nike

我已经安装了rack-timeout gem并在初始化器中创建了rack_timeout.rb。我在rack_timeout.rb中设置了Rack::Timeout.service_timeout = 1。我想限制rack-timeout以在 Controller 超时时停止执行其他比 api 中的 Controller 。只应停止 api Controller 的执行。我在 lib 中创建了一个名为 my_middleware.rb 的自定义中间件

 class MyMiddleware < Rack::Timeout
def initialize(app, options = {})
@app = app
@exclude = options[:exclude]
end

def call(env)
if env['PATH_INFO'].include? "api"
super(env)
else
@app.call(env)
end
end
end

配置/开发.rb
config.middleware.use "MyMiddleware"

但它不起作用。当超时发生时,每个机架超时都会引发异常。

最佳答案

很有趣的问题。将您的请求从执行的时间之外超时不是一个很好的做法,但似乎没有其他现成的解决方案。

我继续 fork rack_timeout ,并根据您的代码添加了基于请求路径的过滤。

基本上,它扩展了 Rack::TimeoutSelect类(class)

class Select < Timeout
def call(env)
if exclude_or_any?(env) #checking for parameters passed on init
super(env)
else
@app.call(env)
end
end
...
end

它使用原始的 initialize 方法并接受 2 个附加参数:
  • exclude: ["paths", "to", "exclude"] - 不要对来自包含所提供字符串的路径的请求运行超时。
  • only: ["only_timeout_this"] - 仅处理来自这些路径的请求。

  • 我不建议定期使用它,因为最好将超时保持在您请求的任何进程内,但为了开发和简单起见,它应该足够了。

    repo 中提供的更多信息:
  • Source
  • Demo application
  • 关于ruby-on-rails - 忽略特定 rails route 的 Rack::Timeout 中间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40764997/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com