Faraday: Ajude a escrever middleware

Criado em 21 jan. 2014  ·  13Comentários  ·  Fonte: lostisland/faraday

Parece-me, com base na documentação, que o seguinte deve funcionar. Mas isso não acontece. Os documentos são ruins para escrever middleware. Em vez disso, alguém pode prestar alguma ajuda.

# play.rb
require 'faraday'

class MyMiddleware

  attr_reader :options

  def initialize(app, options={})
    <strong i="6">@app</strong> = app
    <strong i="7">@options</strong> = options
  end

  def call(env)
    @app.call(env)
  end

end

# This doesn't seem to work either, removing for now.
# Faraday.register_middleware :request, my_middlware: lambda { MyMiddleware }

client = Faraday.new do |conn|
  # conn.request :my_middleware, foo: :bar
  conn.request MyMiddleware, foo: :bar
end

response = client.get('http://jasonwaldrip.com/')
$ ruby play.rb
/Users/jwaldrip/.rbenv/versions/1.9.3-p484/lib/ruby/gems/1.9.1/gems/faraday-0.8.9/lib/faraday.rb:64:in `lookup_middleware': MyMiddleware is not registered on Faraday::Request (RuntimeError)
    from /Users/jwaldrip/.rbenv/versions/1.9.3-p484/lib/ruby/gems/1.9.1/gems/faraday-0.8.9/lib/faraday/builder.rb:146:in `use_symbol'
    from /Users/jwaldrip/.rbenv/versions/1.9.3-p484/lib/ruby/gems/1.9.1/gems/faraday-0.8.9/lib/faraday/builder.rb:100:in `request'
    from play.rb:19:in `block in <main>'
    from /Users/jwaldrip/.rbenv/versions/1.9.3-p484/lib/ruby/gems/1.9.1/gems/faraday-0.8.9/lib/faraday/connection.rb:65:in `initialize'
    from /Users/jwaldrip/.rbenv/versions/1.9.3-p484/lib/ruby/gems/1.9.1/gems/faraday-0.8.9/lib/faraday.rb:11:in `new'
    from /Users/jwaldrip/.rbenv/versions/1.9.3-p484/lib/ruby/gems/1.9.1/gems/faraday-0.8.9/lib/faraday.rb:11:in `new'
    from play.rb:18:in `<main>'

Comentários muito úteis

Um exemplo simples completo ajudaria muito na documentação.

Todos 13 comentários

Experimente conn.use vez de conn.request . Ele está tentando procurar o middleware MyMiddleware em Faraday :: Request.

https://github.com/lostisland/faraday/blob/b8d90a59bafb8dd6e19488fae07945a7700f5664/lib/faraday/rack_builder.rb#L82 -L101

@technoweenie Devemos ter uma documentação melhor sobre como registrar o middleware. Recentemente, tive que fazer isso aqui e li o código para descobrir como.

@jwaldrip Se você registrou seu middleware, poderia dizer conn.request .

Se você registrou seu middleware, poderá dizer conn.request.

Além disso, você deve usar o símbolo com o qual se registrou, não o nome da classe. Os símbolos estão lá apenas como um atalho para incluir o nome completo da classe. conn.request(:json) é basicamente igual a Faraday::Request::JSON .

Devemos ter uma documentação melhor sobre como registrar o middleware.

: +1: Eu empurrei porque planejava mudar completamente o sistema de middleware.

@jwaldrip está certo ao dizer que esta é uma experiência do usuário ruim. Ele comentou a linha que registra o middleware sob uma abreviação de símbolo, mas continuou a usar conn.request setter que só funciona com abreviações de símbolo, eu acho. Portanto, o middleware não foi encontrado.

Devemos pensar em como melhorar isso, ou pelo menos ter uma mensagem de erro melhor.

Eu consegui fazer funcionar, demorou um pouco. Deixe-me saber se eu posso ajudar em alguma coisa com a documentação ou com o retrabalho do middleware.

Qual foi sua configuração final? @jwaldrip

Já houve alguma coisa escrita sobre isso? Não consegui encontrar nada útil e tive que bater com a cabeça por alguns minutos para descobrir.

@stefansedich não tem certeza se houve algum acompanhamento direto ou melhoria após esta discussão, mas estamos planejando fazer um trabalho pesado na documentação junto com a próxima versão principal (1.0), então esperamos que isso não seja um problema no futuro novamente.

Seria ótimo se alguém postasse a aparência exata do registro nesta edição por enquanto.

@maxim Agora temos um site oficial com alguma documentação sobre middleware , mas ainda está melhorando.

Resumindo, request e response só devem ser usados ​​para middleware registrado, se você precisar injetar um customizado é mais fácil chamar .use .
Portanto, no exemplo acima, o seguinte funcionaria:

client = Faraday.new do |conn|
  conn.use MyMiddleware, foo: :bar
end

Um exemplo simples completo ajudaria muito na documentação.

@maxim Agora temos um site oficial com alguma documentação sobre middleware, mas ainda está melhorando.

Resumindo, a solicitação e a resposta devem ser usadas apenas para middleware registrado; se você precisar injetar um customizado, é mais fácil chamar .use.
Portanto, no exemplo acima, o seguinte funcionaria:

client = Faraday.new do |conn|
  conn.use MyMiddleware, foo: :bar
end

@iMacTia Isso não está na documentação, mas é essencial. Talvez possa estar em https://lostisland.github.io/faraday/middleware/custom

@wilsonsilva você está totalmente certo, isso seria uma boa melhora 😅. Estou surpreso por ter faltado para ser justo

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

ioquatix picture ioquatix  ·  4Comentários

yusefu picture yusefu  ·  3Comentários

mattmill30 picture mattmill30  ·  4Comentários

subvertallchris picture subvertallchris  ·  5Comentários

QuinnWilton picture QuinnWilton  ·  4Comentários