我写了一个函数
app :: Request -> H.Session H.Postgres IO Response
它接受 Web 请求并构建响应(根据需要咨询数据库)。为了实际发送响应,我做了一个包装器
runApp :: H.Postgres -> H.SessionSettings -> Application
runApp pg sess req respond =
respond =<< H.session pg sess (app req)
我将此函数传递给Warp以runSettings
永久循环并处理请求:
runSettings appSettings $ runApp pgSettings sessSettings
然而,这真的很糟糕,因为它为每个请求创建一个新会话,这违背了连接池和准备好的语句的目的。
我想打电话给runSettings
里面H.session
而不是反过来。但是runSettings
有一个签名Settings -> Application -> IO ()
,一旦进入IO
我就无法访问会话。有没有办法回到里面Session b m r
?
这是来自私人电子邮件的问题的转贴。