2016-12-09 1 views
2

Итак, я хочу добавить два wai middlewares на сервер моего слуги. Одно промежуточное ПО для обслуживания статических файлов и одно для ведения журнала.Haskell servant wai middleware не работает должным образом

Я определил мой апи (router) и это, как я начинаю свой сервер:

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

А вот как я определил мой middleware:

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

Теперь, если я ставлю logStdoutDev сначала я не могу обслуживать статические файлы, но если сначала поставить staticPolicy, я могу обслуживать статические файлы, но я теряю способность регистрировать события (в основном они игнорируются).

Вопрос действительно, как правильно комбинировать wai промежуточное ПО в слуге.

ответ

6

Если я правильно понял, вы хотите создать два промежуточных программного обеспечения: logStdoutDev и staticPolicy $ addBase "static". Но что ты сделал?

middleware = do 
    logStdoutDev 
    staticPolicy $ addBase "static" 

Это эквивалентно:

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

Итак, что монада используется? Номер middleware имеет тип Application -> Application. Итак, это читатель монады (->) Application.

Выражение logStdoutDev >> (staticPolicy $ addBase "static") эквивалент \r -> (\_ -> (staticPolicy $ addBase "static") r) (logStdoutDev r). Или если мы упростим, мы получим: \r -> (staticPolicy $ addBase "static") r.

Вы должны сделать так:

middleware = logStdoutDev . (staticPolicy $ addBase "static") 
Смежные вопросы