我有一個 WAI 中間件:
myMiddleware :: WAI.Middleware
myMiddleware prevApp req respond = do
resp :: ResponseReceived <- prevApp req respond -- SIC!
let path = T.intercalate "/" $ WAI.pathInfo req
method = WAI.requestMethod req
-- Q: how to get the response's status <---- ???
--respStatus = WAI.responseStatus resp <---- ???
pure resp
我想在哪里獲得回應的狀態(它是 404 或 200 或其他)。但是如果不是Responsemore butResponseReceived怎么辦呢?我只有一個想法,創建,比方說,IORef并將其傳遞給我的函式:
-- an illustration of the idea:
...
xxx <- newIORef []
let myRespond resp = do
atomicWriteIORef' xxx [1,2]
r <- respond resp
pure r
resp <- prevApp req myRespond
...
但是1)我不知道這是不是最簡單和最典型的解決方案;2) a 有多輕newIORef?是否可以根據對我的應用程式的每個請求創建它?
這個問題我之前遇到過很多次,主要問題是:如何訪問中間件中的回應?最終回應,我的意思是如果應用程式以 404 回應,那么能夠在中間件中訪問狀態 404。
uj5u.com熱心網友回復:
總體思路是撰寫一個如下所示的中間件:
mid :: Middleware
mid app req respond = app req respond'
where respond' res = do
let status = responseStatus res
putStrLn $ "status=" show status
respond res
也就是說,您根本不會嘗試訪問ResponseReceived- 它是一種“哨兵”值,不包含無論如何都可以訪問的資訊。相反,您可以respond'使用在繼續原始呼叫之前訪問傳出回應的回呼覆寫傳遞給應用程式的回呼respond。
現在,您如何處理該status值取決于您要實作的目標。創建一個新的 IORef可能會有用,而且它是一種廉價的操作,因此您當然可以為每個請求創建一個(或幾千個)。但是,它似乎不會有很大幫助。一旦你創建了它,你打算將它傳遞給什么功能?如果您能夠為每個請求將一個新的 IORef 傳遞給您的函式,為什么不直接傳遞status呢?
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/536679.html
標籤:哈斯克尔
