2017-06-16 28 views
0

這個問題在2010年已經提出,但我認爲今天可能會有更好的答案。 基本上我需要存儲某種對象,並在每個請求中訪問它,理想情況下,我希望能夠從請求中更改該對象(我猜MVar或IORef會爲此做)。如何使用Snap Framework在服務器端存儲某個對象?

snaplet教程似乎表明它是可能的,但它主要解釋如何使用snaplets(畢竟這是該教程的內容),並沒有真正解釋這個「App」對象如何工作甚至是存儲。我不知道如何將它應用到我的案例中,我不需要snaplets(我正在製作一個API,所以我甚至不需要海斯特)。

所以給出的默認代碼:

site :: Snap() 
site = do 
    ifTop (writeBS "hello world") <|> 
    route [ ("stuff/:param", someHandler) ] <|> 
    dir "static" (serveDirectory ".") 

如何更改爲「註冊」一些地方的對象,我可以在someHandler使用? 2010年的答案只是將其部分應用於每個處理程序,這將起作用,但Snaplet教程讓我覺得必須有更好的方法。

+0

你可以添加一個鏈接到你指的答案嗎? –

+0

噢,對不起:https://stackoverflow.com/questions/3903205/how-do-i-maintain-a-server-side-state-with-snap-framework – Ulrar

+0

幾乎所有的捕捉函數都有返回類型' MonadSnap m => .. - > m X'。因此,只需創建一個實例'MonadSnap m => MonadSnap(ReaderT m)'(如果它不存在),並且您不必顯式傳遞環境。 – user2407038

回答

0

在snaplet教程的「使用狀態」一節中,他們解釋瞭如何使用本地狀態。如果您查看上面名爲「Snaplet Overview」一節中的第二個代碼段,可以看到他們在使用Lens初始化數據類型時是如何設置狀態的。

不知道你對這些東西有多熟悉,但Lens可以讓你訪問(即讀/寫/調整)較大值內的數據片段。在這種情況下,服務器的整個狀態表示爲一個數據塊(記錄類型值),當服務器處於初始化狀態時,該數據塊將被初始化。

請注意:_companyName :: IORef B.ByteString < - 是您可以在示例中進行變異的狀態,以及「正在使用狀態」這一部分,這正是他們所做的。他們有一個例子,它接受HTTP GET或POST到該URL,並用新的「name」參數(POST)更新它,並返回新的狀態,或者如果它是GET,它只返回當前狀態。

+0

好吧,所以基本上你需要將你的整個應用程序變成一個Snaplet來獲得一個狀態,如果我理解正確的話。似乎工作,我認爲這不會影響表演,因爲我不真的使用snaplets,只是一個?對我來說不重要,只是好奇 – Ulrar

+0

我對Snap的理解是,從某個版本開始,**所有內容都是用snaplets構建的,它是任何應用程序員級別關注的基礎級抽象。這提供了模塊化並且非常高效。鏡頭是非常輕便的數據訪問記錄,也是非常基礎的。 Snaplets的核心是狀態,所以這將成爲將狀態引入快速應用程序的規範方法。根據我的理解,它速度快,效率高,但爲什麼不做一些分析:) –

相關問題