【问题标题】:How do I store some object on server-side with Snap Framework?如何使用 Snap 框架在服务器端存储一些对象?
【发布时间】:2017-06-17 07:28:44
【问题描述】:

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

snaplet 教程似乎表明它是可能的,但它主要解释了如何使用 snaplet(毕竟那是那个教程的目的),并没有真正解释这个“应用程序”对象是如何工作的,甚至是如何存储的。我不知道如何将它应用到我不需要 snaplets 的情况下(我正在制作一个 API,所以我什至不需要 Heist)。

所以给定默认代码:

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

如何将其更改为“注册”某个我可以在 someHandler 中使用的对象? 2010 年的答案是将其部分应用于每个处理程序,这会起作用,但 Snaplet 教程让我认为必须有更好的方法。

【问题讨论】:

  • 您可以添加指向您所指答案的链接吗?
  • 哦,是的,对不起:stackoverflow.com/questions/3903205/…
  • 几乎所有的 snap 函数都有返回类型MonadSnap m =&gt; .. -&gt; m X。因此,只需创建一个实例 MonadSnap m =&gt; MonadSnap (ReaderT m)(如果它不存在),您不必显式传递环境。

标签: haskell haskell-snap-framework


【解决方案1】:

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

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

注意这一点:_companyName :: IORef B.ByteString

【讨论】:

  • 好吧,如果我理解正确的话,基本上你需要把你的整个应用程序变成一个 Snaplet 来获得一个状态。似乎正在工作,我认为这不会影响性能,因为我并没有真正使用 snaplets,只是一个?对我来说这并不重要,只是好奇
  • 我对 Snap 的理解是,由于某个版本,一切都是用 snaplets 构建的,这是任何应用程序程序员级别问题的基本抽象级别。这提供了模块化并且非常有效。镜头是对记录的极其轻量级的数据访问,也是极其基础的。 Snaplet 的核心是关于状态的,因此这将是在您的 snap 应用程序中获取状态的规范方式。据我了解,它既快速又高效,但为什么不做一些分析:)
猜你喜欢
  • 2011-04-23
  • 2018-03-16
  • 2010-11-11
  • 1970-01-01
  • 2015-07-03
  • 2021-09-25
  • 1970-01-01
  • 2012-07-14
  • 2013-08-08
相关资源
最近更新 更多