2016-12-09 12 views
2

したがって、私はサーバントサーバに2つのwaiミドルウェアを追加したいと思います。静的ファイルを提供するための1つのミドルウェアと、ロギングのための1つ。Haskell servant waiミドルウェアが正しく動作しない

私は私のAPI定義された(router)を持っており、これは私が私のサーバを起動する方法です:

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

、私はlogStdoutDevを置く場合:

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

そして、ここでは、私は私のmiddlewareを定義した方法です最初は静的ファイルを提供することができませんが、staticPolicyを最初に置くと、静的ファイルを提供することができますが、イベントをログに記録する機能が失われます(基本的に無視されます)。

質問は実際にサーバントでwaiミドルウェアを正しく組み合わせる方法です。

答えて

6

私が正しく理解している場合は、2つのミドルウェアを構成するとします。logStdoutDevstaticPolicy $ 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") 

あなたはこのように行うためにすべき

関連する問題