すべての要求に対して特定のアクションを実行する場合は、ルーティング コードの前に do ステートメントに追加できます。例えば:
module Main where
import Happstack.Server
main = simpleHTTP nullConf $ do incCounter
mUser <- checkUserAuth
resp <- msum [ part1
, part2
, part3 mUser
]
logResponse resp
return resp
それは常に実行さincCounter
れ、checkUserAuth
. その後、さまざまなルートを試します。
いずれかのルートが一致すると、 が呼び出さlogResponse
れ、最後に が返さresp
れ、ユーザーに送信されます。
whileincCounter
とcheckUserAuth
will は常に実行さlogResponse
れ、いずれかの部分が一致する場合にのみ実行されることに注意してください。何も実行しない場合、コードがエスケープして 404 を返すと確信しています。常に実行したい場合は、常に一致logResponse
するハンドラーを に追加できます。msum
例えば:
resp <- msum [ part1
, part2
, part3 mUser
, notFound $ toResponse "Sorry, page not found."
]
それはほとんど常に実行されます。部分の 1 つが一致するが、明示的に「エスケープ」を呼び出す場合、logResponse
まだ実行されないことは確かです。対処方法もあります。
しかし、簡単に言えば、何かをすぐに実行したい場合は、msum
コードの前に置くだけです。