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 中间件。

如果我没理解错的话,你想组成两个中间件:logStdoutDevstaticPolicy $ 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")