如何使用 Snap 框架在服务器端存储一些对象



这个问题在2010年就已经问过了,但我想今天可能有更好的答案。基本上,我需要存储某种对象并在每个请求中访问它,理想情况下,我希望能够从请求中更改该对象(我想 MVar 或 IORef 会为此(。

snaplet 教程似乎表明这是可能的,但它主要解释了如何使用 snaplet(毕竟这就是该教程的目的(,并没有真正解释这个"App"对象是如何工作的,甚至是存储的。我不知道如何将其应用于我的情况,在那里我不需要快照(我正在制作一个API,所以我甚至不需要Heist(。

所以给定默认代码:

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

如何更改它以在某个处理程序中使用的某个对象"注册"某个对象?2010 年的答案只是将其部分应用于每个处理程序,这将有效,但 Snaplet 教程让我认为一定有更好的方法。

在 snaplet 教程的"使用状态"部分中,他们解释了如何使用本地状态。如果您查看上面名为"Snaplet 概述"部分中的第二个代码段,您可以看到他们在使用 Lens 初始化数据类型时如何设置状态。

不确定您对这些东西有多熟悉,但Lens允许您访问(即读/写/调整(较大值中的数据片段。在这种情况下,服务器的整个状态表示为一个数据 blob(记录类型值(,在服务器时初始化。

请注意:_companyName :: IORef B.ByteString <- 是您可以在示例中更改的状态片段,而在"使用状态"部分中,这就是它们所做的。他们有一个示例,它将HTTP GET或POST带到该URL,然后使用新的"name"参数(POST(更新它并返回新状态,或者如果它是一个GET,它只返回当前状态。

最新更新