3

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

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

然后我像这样使用它:

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)]

执行此操作时,http :3000/foo我希望服务器打印Just 42但在 prints 中Nothing,这表明fooMW. 我想我错过了一些关于如何编写中间件或如何使用vault的重要内容,但是什么?

4

1 回答 1

2

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

于 2020-07-07T15:52:44.980 回答