Haskell 将数据放入请求vault的中间件

Haskell 将数据放入请求vault的中间件,haskell,scotty,wai,Haskell,Scotty,Wai,我正试图编写一个WAI中间件,将一些数据放入请求的vault中,但我似乎遗漏了一些内容,因为我以后无法查找它。即使是最简单的中间件也会失败: fooMW :: Middleware fooMW app req sendResponse = do k <- Vault.newKey @Int let d = 42 newVault = Vault.insert k d (vault req) app (req {vault = newVault}) $ \res -&

我正试图编写一个WAI中间件,将一些数据放入请求的vault中,但我似乎遗漏了一些内容,因为我以后无法查找它。即使是最简单的中间件也会失败:

fooMW :: Middleware
fooMW app req sendResponse = do
  k <- Vault.newKey @Int
  let d = 42
      newVault = Vault.insert k d (vault req)
  app (req {vault = newVault}) $ \res -> sendResponse res
fooMW::中间件
fooMW app req sendResponse=do
k发送响应res
然后我用这个:

main = scotty 3000 $ do
  middleware fooMW
  get "/foo" $ do
    k <- liftIO $ Vault.newKey @Int
    v <- vault <$> request
    let d = Vault.lookup k v
    liftIO $ print d
    json $ object ["foo" .= ("bar" :: Text)]
main=scotty 3000$do
中间件fooMW
获取“/foo”$do

k调用
Vault.newKey每次生成一个不同的密钥,因此它应该被调用一次并共享,而不是每次使用密钥时都被调用。谢谢@danidiaz

代码似乎假定对
Vault.newKey
的两次调用返回相同的密钥,但我不确定是否是这样。也许您可以在
main
中创建一次密钥,然后在中间件和处理程序之间共享它。谢谢你澄清这一点。