Сохранить состояние в памяти [Сервер Haskell] - PullRequest
0 голосов
/ 24 июня 2019

Я пытаюсь создать сервер, который возвращает два разных значения из маршрута в зависимости от того, посетил ли его пользователь ранее.У меня есть следующий код:

{-# 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. Где и как я могу сохранить состояние приложения?

1 Ответ

3 голосов
/ 24 июня 2019

Вы можете использовать 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 )

...