Was ist der Unterschied zwischen den Methoden use
und run
in den Rackup-Dateien? Es scheint run
ist immer am Ende von config.ru
, aber es scheint, als ob Sie nur use
verwenden könnten. Aufschlussreiche Ressourcen würden auch sehr geschätzt werden.Unterschied zwischen Verwendung und Ausführung im Rack
Antwort
use
ist für Middle
class MyCustomMiddleware
def initialize(app)
@app = app
end
def call(env)
if condition
env['set-header'] = 'Middleware Can modify the response & pass it into next middleware'
end
@app.call(env)
end
run
ein Argument, das zu nennen reagiert und gibt eine endgültige Rack-Antwort mit einem HTTP-Response-Code wie 200.
class MyApp
def self.call(env)
[200, { "Content-Type" => "text/html" }, ["OK"]]
end
end
den Unterschied zwischen use
Um zu verstehen, & run
. Sehen wir uns die Struktur der typischen Rack App an.
Typische Rack-App Rack-App mehrere Middleware (n), die zu call
reagieren enthält aber nicht zurück letzte Rack Antwort & ein Objekt ab, auf call
reagiert, die letzte Rack Antwort zurückgibt, die HTTP-Response-Code enthält (200.404, 500 etc). so gibt es typischerweise mehrere Objekte, die als Mittel & dann ein Objekt, das endgültige Rack-Antwort mit Antwortcode zurückgibt.
Unterschied zwischen use
& run
Jetzt mit diesem, scheint es können wir use
mehrere Male aufrufen können, einmal für jede Middleware & run
nur einmal in einem einzigen Rack-App. Daher ruft use
nur eine Middleware auf, während run
das Rack-Objekt ausführt, das die endgültige Rack-Antwort mit HTTP-Statuscode zurückgibt.
Beispiel config.ru
use MyCustomMiddleware
use MyCustomMiddleware2
use MyCustomMiddleware3
run MyApp
Im Fall, wenn etwas über falsch ist, lassen Sie es mich wissen. Also kann ich es korrigieren.
Ist es möglich, irgendwo in der Pipeline von Middleware zu stoppen, zum Beispiel wegen eines Authentifizierungsfehlers? – Cenoc
^^^ Ja. Tatsächlich wird eine ähnliche Methode von Auth von Warden verwendet - eine Rack-basierte Auth, die von allen beliebten Edelsteinen wie Devise verwendet wird. Sie können seine [Quelle der # Call-Methode] (https://github.com/hassox/warden/blob/master/lib/warden/manager.rb#L30-L49) sehen. Im Kern sucht die #call-Methode einfach nach einem bedingten & etwas zu tun. Das gleiche wie in meinem obigen Beispiel. – CuriousMind