2015-04-15 20 views

回答

1

如果您使用Builder(使用,運行等),它不會而不是看起來像您可以在運行時輕鬆注入或刪除中間件。代碼如下:https://github.com/rack/rack/blob/master/lib/rack/builder.rb

請注意,它構建了中間件堆棧,當您調用run時,它會在中間件對象樹中實例化堆棧(稱爲「@use」),每個中間件對象都有對下一個對象的引用 - 請參閱「使用」和「to_app」方法。

所以:不要認爲Builder設計允許動態地添加和減少堆棧中的中間件。

您可以重新構建一個新的動態堆棧,或者在有和沒有測試中間件的情況下使用多個Rack應用程序,或者像Rails那樣做一些後向移動來動態重新配置堆棧。

您還可以僅在測試模式下添加測試中間件,或者可以輕鬆禁用測試中間件,以便它成爲傳遞中間件。然後你的spec_helper會設置並清除告訴它通過的變量。

+1

好的,謝謝。我以爲你可以在Rails中做到這一點,或許可以在Rack中做到這一點。我目前正在爲測試使用單獨的機架構建,但這會造成重複。我認爲這比用測試代碼污染生產版更好。 –

+1

用於測試的獨立機架生成器可能與您在此獲得的解決方案一樣乾淨。 –

+1

Rails保留了一個不同的非生成器堆棧。如果你需要其他的東西,太棒了。但是如果你需要爲了這個問題而構建/複製,那麼對於結果來說代碼和複雜性就太多了。 –

0

因爲我想前插到中間件堆棧,解決這一特定使用案例很容易。

鑑於如上定義一個名爲 「應用程序」 一個應用程序,添加新的中間件:use ...

def new_app 
    Rack::Builder.new do 
    use ... 
    use ... 

    run app 
    end.to_app 
end 
相關問題