Я пытаюсь создать сервер, который возвращает два разных значения из маршрута в зависимости от того, посещал ли его ранее пользователь. У меня есть следующий код:
{-# 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!"
(Если вы планируете масштабировать это до сложного сервера, вам нужно передать TVar в форме Шаблон ReaderT)
Вы можете добавить файл cookie и проверить файл cookie, чтобы определить, является ли это первым посещением.