在内存中保存状态 [Haskell 服务器]
Save state in memory [Haskell Server]
我正在尝试创建一个服务器,该服务器 returns 来自路由的两个不同值取决于用户之前是否访问过它。我有以下代码:
{-# LANGUAGE OverloadedStrings #-}
module Main where
import Web.Scotty
main = do
putStrLn "Starting Server..."
scotty 3000 $ do
get "/" $ do
-- if first time
text "hello!"
-- if second time
text "hello, again!"
我有两个问题:
1. 如何查看用户之前是否请求过路由?
2. 我在哪里以及如何保存应用程序状态?
您可以使用 STM
在内存中保存一个可变变量:
import Control.Concurrent.STM.TVar
main = do
putStrLn "Starting Server..."
state <- newTVarIO :: IO VisitorsData
scotty 3000 $ do
get "/" $ do
visitorsData <- readTVarIO state
-- if the visitor's ID/cookie is in visitorsData
text "hello!"
-- if new visitor, add them to visitorsData
atomically $ modifyTVar state $ insertVisitor visitorId visitorsData
-- if second time
text "hello, again!"
(如果您希望将其扩展到复杂的服务器,您需要以 ReaderT pattern 的形式传递 TVar)
我正在尝试创建一个服务器,该服务器 returns 来自路由的两个不同值取决于用户之前是否访问过它。我有以下代码:
{-# LANGUAGE OverloadedStrings #-}
module Main where
import Web.Scotty
main = do
putStrLn "Starting Server..."
scotty 3000 $ do
get "/" $ do
-- if first time
text "hello!"
-- if second time
text "hello, again!"
我有两个问题: 1. 如何查看用户之前是否请求过路由? 2. 我在哪里以及如何保存应用程序状态?
您可以使用 STM
在内存中保存一个可变变量:
import Control.Concurrent.STM.TVar
main = do
putStrLn "Starting Server..."
state <- newTVarIO :: IO VisitorsData
scotty 3000 $ do
get "/" $ do
visitorsData <- readTVarIO state
-- if the visitor's ID/cookie is in visitorsData
text "hello!"
-- if new visitor, add them to visitorsData
atomically $ modifyTVar state $ insertVisitor visitorId visitorsData
-- if second time
text "hello, again!"
(如果您希望将其扩展到复杂的服务器,您需要以 ReaderT pattern 的形式传递 TVar)