【问题标题】:Can not access response.body inside after filter block in Sinatra 1.0在 Sinatra 1.0 中的过滤器块后无法访问 response.body
【发布时间】:2010-03-20 19:59:45
【问题描述】:

我正在努力解决一个奇怪的问题。根据http://github.com/sinatra/sinatra(部分过滤器),响应对象在 Sinatra 1.0 的过滤器块后可用。但是 response.status 可以正确访问,我在过滤后的路由中看不到非空 response.body。

我有这个机架文件:

config.ru

require 'app'
run TestApp

然后使用以下命令安装 Sinatra 1.0.b gem:

gem install --pre sinatra

这是我的小应用程序,只有一条路线:

app.rb

require 'rubygems'
require 'sinatra/base'

class TestApp < Sinatra::Base

  set :root, File.dirname(__FILE__)

  get '/test' do
    'Some response'
  end

  after do
    halt 500 if response.empty? # used 500 just for illustation
  end

end

现在,我想访问 after 过滤器中的响应。当我运行这个应用程序并访问 /test URL 时,我得到了一个 500 响应,好像响应是空的,但响应显然是“一些响应”。

随着我对 /test 的请求,浏览器向 /favicon.ico 发出单独的请求,并且返回 404,因为没有路由也没有静态文件。但我希望返回 500 状态,因为响应应该为空。

在控制台中,我可以看到在 after 过滤器中,对 /favicon.ico 的响应类似于“未找到”,而对 /test 的响应确实是空的,即使路由返回了响应。

我错过了什么?

【问题讨论】:

    标签: ruby sinatra


    【解决方案1】:

    response.body 设置为 Sinatra::Base#invoke,它环绕 Sinatra::Base#dispatch!,它反过来调用过滤器。但是,#invoke 会在调度后设置响应正文!已完成,因此身体尚未设置。您想要做的可能最好使用机架中间件来解决。

    【讨论】:

    • 很抱歉听到这个消息。我将 after 过滤器视为所有路线的一种 ensure 块。但是我仍然认为,当 response 对象在 after 块中可用并且设置了 response.status (尤其是 200)时,它应该包含主体并且不应该为空。还是我错了?
    • 响应状态和所有这些呢?例如,我只想在响应成功时运行某个后过滤器。但是,在我的后过滤器中,状态始终为 200,即使我在同一路由的前过滤器中使用 404 调用停止。如果我不能这样做,我看不到后过滤器的用途。
    • ChuckE:你运行的是什么版本的 Sinatra?你能打开一个问题吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-24
    • 1970-01-01
    • 2016-08-11
    • 1970-01-01
    • 2016-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多