我正在尝试创建一个从路由返回两个不同值的服务器,具体取决于用户之前是否访问过它。我有以下代码:
{-# 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.我可以在哪里以及如何保持应用程序状态?
答案 0 :(得分:3)
您可以使用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)