簡體   English   中英

如何使用Snap Framework在服務器端存儲一些對象?

[英]How do I store some object on server-side with Snap Framework?

該問題已在2010年提出,但我認為今天可能會有更好的答案。 基本上,我需要存儲某種對象並在每個請求中訪問它,理想情況下,我希望能夠在請求中更改該對象(我想MVar或IORef可以做到這一點)。

snaplet教程似乎表明有可能,但是它主要說明了如何使用snaplet(畢竟這是該教程的目的),並且並沒有真正解釋該“ App”對象的工作方式或存儲方式。 我不知道如何將其應用到我不需要Snaplet的情況下(我正在制作API,因此甚至不需要Heist)。

所以給定默認代碼:

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

如何更改此設置以“在某些地方可以在someHandler中使用”某個對象“注冊”? 2010年的答案是將其部分應用到每個處理程序,這將起作用,但是Snaplet教程使我認為必須有更好的方法。

在snaplet教程的“使用狀態”一節中,他們解釋了如何使用本地狀態。 如果您在上面的“快照概述”部分中查看第二段代碼,則可以看到他們使用Lens初始化其數據類型時如何設置狀態。

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

請注意以下_companyName :: IORef B.ByteString_companyName :: IORef B.ByteString <-是一種狀態,您可以在示例中_companyName :: IORef B.ByteString ,而在“使用狀態”部分中,它們正是這樣做的。 他們有一個使用HTTP GET或POST到該URL的示例,並使用新的“名稱”參數(POST)更新它並返回新狀態,或者如果它是GET,則僅返回當前狀態。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM