我不需要這個功能,我只是出于好奇才問的。
我知道中間件會在每個請求之前運行。
然而,期望中間件在每個請求之后運行是否合理呢?
如果是這樣,我們該如何去做?
如果不是這樣,我們該如何去做?
如果不是,記錄器中間件如何報告對請求的回應?
如果不是,記錄器中間件如何報告對請求的回應?
uj5u.com熱心網友回復:
在Rails中,中間件被安排在一個堆疊中(你可以認為這個堆疊是一個管道),請求和回應以兩個相反的方向拋出堆疊。
Rails中間件堆疊
$rails middleware
請求 # ... ^
| use Rack::ETag |
| use Rack::TempfileReaper |
| use Warden::Manager |
| run Bookstore::Application.routes response
V
為了使堆疊中的中間件聯系在一起,較高的中間件會遞回呼叫較低的中間件,讓我們看一些代碼來理解它是如何作業的,假設我們有2個中間件m1和m2,其中m1在堆疊中被安排在m2的正上方,那么請求和回應的流程就會像下面這樣扔給m1、m2(步驟依次為[1]、[2]、...):
為了使堆疊的中間件聯系在一起,高的中間件會遞回呼叫低的中間件。
class M1
def initialize(app)
@app = app
end
def call(env) # [1] high middleware call
# [2] 遞回呼叫前
# you could get request
request = ActionDispatch::Request.new env
# log request , or something else ...
status, headers, body = # [9] get response from M2
@app.call(env) # [3] 呼叫遞回M2。
# log response, or do something else ...
[status, headers, body] # [10] 回傳回應到更高的中間件。
結束。
end
class M2
def initialize(app)
@app = app
end
def call(env) # [4] M1 call
# [5] 在呼叫遞回下層中間件之前。
# 同上
status, headers, body = # [7] 從下層中間件獲取回應
@app.call(env) # [6] 呼叫遞回的下層中間件。
# log response, or do something else ...
[status, headers, body] # [8] 回傳上述M1的回應。
結束。
end
而最底層的中間件是Rails應用程式,所以呼叫堆疊看起來像一個鏈
call( ... call( ... call( ... rails_app.call() ))...)<
所以你可以通過在這個鏈中添加/插入_before(after)/移除節點來改變應用程式的行為(或者你的應用程式如何處理請求/回應),非常靈活!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/307029.html
標籤:
上一篇:RailsandSQL-通過陣列中的所有元素獲取相關資訊,條目
下一篇:用php從物件json中讀取資料
