2

所以,我想向我的服务服务器添加两个 wai 中间件。一种用于提供静态文件的中间件,一种用于日志记录的中间件。

我定义了我的 api ( router),这就是我启动服务器的方式:

webServer :: IO ()
webServer = run 80 (middleware $ router)

这就是我如何定义我的middleware

middleware :: Application -> Application
middleware = do
  logStdoutDev
  staticPolicy $ addBase "static"

现在,如果我把它logStdoutDev放在第一位,我就不能提供静态文件,但是如果我把它staticPolicy放在第一位,我就可以提供静态文件,但是我失去了记录事件的能力(基本上它们被忽略了)。

问题真的是,如何wai在servant中正确组合中间件。

4

1 回答 1

9

如果我理解正确,您想组合两个中间件:logStdoutDevstaticPolicy $ addBase "static". 但是你做了什么?

middleware = do
    logStdoutDev
    staticPolicy $ addBase "static"

它相当于:

middleware = logStdoutDev >> (staticPolicy $ addBase "static")

那么,使用了什么单子?有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")
于 2016-12-09T13:41:49.250 回答