2

リストにある通常のハップスタックのケースがServerPart Response MonadPlusあります。次にmsum、失敗しないものを選択し、応答が生成されて返されます。

Cookie のチェックなど、接続コンテキストの準備 (認証されたユーザーの承認、カウントの実装など) のようないくつかのアクションは、パス情報がまだ定義されていなくても、着信要求で実行する必要があるという意見があります。

たぶん、私がまだ知らないバズワード、特にそのような種類のスタッフ向けです。誰かアドバイスをお願いできますか?

4

1 に答える 1

4

すべての要求に対して特定のアクションを実行する場合は、ルーティング コードの前に 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れ、ユーザーに送信されます。

whileincCountercheckUserAuthwill は常に実行さlogResponseれ、いずれかの部分が一致する場合にのみ実行されることに注意してください。何も実行しない場合、コードがエスケープして 404 を返すと確信しています。常に実行したい場合は、常に一致logResponseするハンドラーを に追加できます。msum例えば:

                 resp <- msum [ part1
                              , part2
                              , part3 mUser
                              , notFound $ toResponse "Sorry, page not found."
                              ]

それはほとんど常に実行されます。部分の 1 つが一致するが、明示的に「エスケープ」を呼び出す場合、logResponseまだ実行されないことは確かです。対処方法もあります。

しかし、簡単に言えば、何かをすぐに実行したい場合は、msumコードの前に置くだけです。

于 2012-12-18T04:41:32.537 に答える