如何存储从中间件生成的值并从路由中检索它们

时间:2018-09-11 20:51:29

标签: haskell haskell-wai

我有一个wai中间件,它产生两个值:

  1. 为每个请求随机生成的请求ID
  2. 从请求到另一个服务的用户。

代码如下:

addRequestIdToRequestHeader' :: Application -> Application
addRequestIdToRequestHeader' app req respond = do
  rid <- nextRequestId :: IO ByteString
  user <- fetchUserByReq req :: IO User
  req' <- attachUserAndRequestIdToRequest user rid
  app req' respond

现在我有一条路线GET /user。在这条路线的内部,我想访问请求ID和用户。例如,我可能只将它们打印在日志中。

main :: IO ()
main =
  scotty 8080 $ do
    get "/user" $ do
      req <- request
      rid <- liftAndCatchIO $ getRequestIdFromRequest req
      user <- liftAndCatchIO $ getUserFromRequest req
      liftAndCatchIO $ print rid
      liftAndCatchIO $ print user
      text $ username user

问题是因为请求ID和用户是从中间件生成的,如何从路由访问它们?基本上如何实现以上代码中使用的以下功能:

attachUserAndRequestIdToRequest :: User -> ByteString -> Request -> IO Request

getRequestIdFromRequest :: Request -> IO ByteString

getUserFromRequest :: Request -> IO User

该场景是中间件是Auth中间件,它将请求转发到另一个服务进行身份验证,并取回路由中需要的用户值。

0 个答案:

没有答案