我正在使用自定义 monad(带有阅读器)轻松地将数据库池之类的数据传递给我的处理程序(在使用自定义 monad 之前,我曾经将连接作为 fn 参数传递)。
这就是我定义我的自定义 monad 的方式:
newtype Controller a = Controller
{ runController :: ReaderT ServerEnvironment Handler a
} deriving ( Functor, Applicative, Monad, MonadReader ServerEnvironment,
MonadError ServantErr, MonadIO )
这ServerEnvironment
只是我用来携带数据的自定义数据类型。
问题是AuthHandler
我必须专门使用以下功能:
r -> Handler usr
作为身份验证处理程序,我不能使用我的自定义处理程序:
r -> Controller usr
而且我也无法通过,ConnectionPool
因为签名不能是:
ConnPool -> r -> Handler usr
那么,如何在不使用全局IO
状态的情况下将额外数据传递给servant 中的身份验证处理程序?