Haskell servant wai 中间件无法正常工作
Haskell servant wai middleware not working properly
所以,我想在我的仆人服务器上添加两个 wai 中间件。一种用于提供静态文件的中间件,一种用于日志记录。
我定义了 api (router
),这就是我启动服务器的方式:
webServer :: IO ()
webServer = run 80 (middleware $ router)
这是我定义 middleware
的方式:
middleware :: Application -> Application
middleware = do
logStdoutDev
staticPolicy $ addBase "static"
现在,如果我将 logStdoutDev
放在第一位,我将无法提供静态文件,但如果我将 staticPolicy
放在第一位,那么我可以提供静态文件,但我失去了记录事件的能力(基本上他们被忽略了)。
真正的问题是,如何在 servant 中正确组合 wai
中间件。
如果我没理解错的话,你想组成两个中间件:logStdoutDev
和 staticPolicy $ addBase "static"
。但是你做了什么?
middleware = do
logStdoutDev
staticPolicy $ addBase "static"
相当于:
middleware = logStdoutDev >> (staticPolicy $ addBase "static")
那么,使用了什么monad? middleware
的类型为 Application -> Application
。所以它是 monad reader (->) Application
.
表达式logStdoutDev >> (staticPolicy $ addBase "static")
等价于\r -> (\_ -> (staticPolicy $ addBase "static") r) (logStdoutDev r)
。或者,如果简化,我们将得到:\r -> (staticPolicy $ addBase "static") r
.
你应该这样做:
middleware = logStdoutDev . (staticPolicy $ addBase "static")
所以,我想在我的仆人服务器上添加两个 wai 中间件。一种用于提供静态文件的中间件,一种用于日志记录。
我定义了 api (router
),这就是我启动服务器的方式:
webServer :: IO ()
webServer = run 80 (middleware $ router)
这是我定义 middleware
的方式:
middleware :: Application -> Application
middleware = do
logStdoutDev
staticPolicy $ addBase "static"
现在,如果我将 logStdoutDev
放在第一位,我将无法提供静态文件,但如果我将 staticPolicy
放在第一位,那么我可以提供静态文件,但我失去了记录事件的能力(基本上他们被忽略了)。
真正的问题是,如何在 servant 中正确组合 wai
中间件。
如果我没理解错的话,你想组成两个中间件:logStdoutDev
和 staticPolicy $ addBase "static"
。但是你做了什么?
middleware = do
logStdoutDev
staticPolicy $ addBase "static"
相当于:
middleware = logStdoutDev >> (staticPolicy $ addBase "static")
那么,使用了什么monad? middleware
的类型为 Application -> Application
。所以它是 monad reader (->) Application
.
表达式logStdoutDev >> (staticPolicy $ addBase "static")
等价于\r -> (\_ -> (staticPolicy $ addBase "static") r) (logStdoutDev r)
。或者,如果简化,我们将得到:\r -> (staticPolicy $ addBase "static") r
.
你应该这样做:
middleware = logStdoutDev . (staticPolicy $ addBase "static")