我有一个产生两个值的 wai 中间件:
- 为每个请求随机生成的请求 id
- 一个用户从一个请求到另一个服务。
这是代码:
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 中间件,它将请求转发到另一个服务进行身份验证并取回用户值,这将在路由中需要。