Happstackサーバーを作成していて、接続するMongoDBデータベースがあります。そのために、接続プールを作成する関数を作成しました
type MongoPool = Pool IOError Pipe
withMongo :: (MongoPool -> IO a) -> IO ()
withMongo f = do
pool <- dbPool
f pool
killAll pool
そしてAction
、作成されたプールでを実行する関数:
runDB :: (MonadIO m) => MongoPool -> Action IO a -> m (Either Failure a)
runDB pool f = liftIO $ do
pipe <- runIOE $ aResource pool
access pipe master dbName f
pool
これには、すべてのルートでパラメータとしてを実行する必要があることは明らかです。私はそれをにラップしたいReaderT
ので、それrunDB
はのようなタイプAction IO a -> ServerPart (Either Failure a)
またはそれ以上のタイプを持つことができAction IO a -> ServerPart a
、失敗すると自動的にHTTPエラー500が発生します。
それをどのように達成できるかについて頭を悩ませています。Haskellモナドとhappstackの経験が豊富な人からのヒントが欲しいです。
ありがとう。