将状态保存在内存中[Haskell服务器]

时间:2019-06-24 09:02:20

标签: haskell scotty

我正在尝试创建一个从路由返回两个不同值的服务器,具体取决于用户之前是否访问过它。我有以下代码:

{-# 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 个答案:

答案 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)