这个简单的程序崩溃了,因为当 logger 被调用时,还没有标题和正文。
require 'faraday'
conn = Faraday.new(url: "http://google.com") {|config| config.response :logger}
conn.get "/"
/Users/synapse/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/faraday-0.8.8/lib/faraday/response/logger.rb:31:in `dump_headers': undefined method `map' for nil:NilClass (NoMethodError)
from /Users/synapse/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/faraday-0.8.8/lib/faraday/response/logger.rb:25:in `block in on_complete'
from /Users/synapse/.rbenv/versions/2.0.0-p247/lib/ruby/2.0.0/logger.rb:376:in `add'
from /Users/synapse/.rbenv/versions/2.0.0-p247/lib/ruby/2.0.0/logger.rb:404:in `debug'
from /Users/synapse/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/faraday-0.8.8/lib/faraday/response/logger.rb:25:in `on_complete'
from /Users/synapse/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/faraday-0.8.8/lib/faraday/response.rb:9:in `block in call'
from /Users/synapse/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/faraday-0.8.8/lib/faraday/response.rb:63:in `on_complete'
from /Users/synapse/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/faraday-0.8.8/lib/faraday/response.rb:8:in `call'
from /Users/synapse/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/faraday-0.8.8/lib/faraday/response/logger.rb:20:in `call'
from /Users/synapse/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/faraday-0.8.8/lib/faraday/connection.rb:253:in `run_request'
from /Users/synapse/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/faraday-0.8.8/lib/faraday/connection.rb:106:in `get'
from faraday_bug.rb:4:in `<main>'
这是预期的。 如果没有发出 HTTP 请求,即没有适配器,任何中间件都不能工作。
Faraday.new(url: "http://google.com") do |conn|
conn.response :logger
conn.adapter Faraday.default_adapter
end
@mislav虽然这是预期的行为,但由此产生的错误消息可能更有用。
我同意@sethvargo ,信息可能会更好。
就我而言,我从无参数变为Faraday.new
,然后添加conn.response :logger
。 我本来希望adapter
默认为default_adapter
,所以我对新错误感到相当困惑。 我正在调试另一个错误并没有帮助,所以我认为这可能是我原始错误的另一个症状。
我也遇到了这个问题。 我会说,如果未指定,预期的行为是法拉第使用默认适配器。
如果您不想这样做,“未指定适配器”异常将节省很多麻烦。
@mislav我正要说@bluefuton刚刚说的话。 我的意思是它被称为“default_adapter”,这表明它是默认的。
哦,我只是被同样的东西咬了。 可能是常见错误的神秘错误消息。 (我删除了适配器规范,因为我错误地认为它不需要是明确的。)
@mislav您是否会接受拉取请求以将错误更改为“未指定适配器”之类的内容?
或者(但您似乎不希望这样做)如果没有明确指定,则假定为“默认适配器”?
哦,嘿@pengwynn ,注意到你也是这个组织的一员。 由于米斯拉夫没有在上面回复,对此有什么想法吗? 不过,不要故意踩到任何人的脚趾 - 如果米斯拉夫做出这些决定,我不想绕过他:)
消息应该更好。 虽然,正如我所说的,没有适配器,任何中间件都无法实际工作。 因此,专门为此中间件改进错误消息会在其他中间件中留下其他神秘的故障。
正确的解决方案应该是,当 Connection 对象在堆栈中不包含适配器时,法拉第会提前中止。 请订阅#47、#121、#170之一
@mislav Aha,感谢您的澄清!
我想我会尝试发出一个 pull request 来改进来自 logger 的错误消息——这似乎是一个相当简单的改变,可以改进一个常见的问题。 希望没问题。
我也可能会研究正确的修复方法,但这似乎更具挑战性,所以我可能没有时间或技能来实现它。
最有用的评论
这是预期的。 如果没有发出 HTTP 请求,即没有适配器,任何中间件都不能工作。