haskell - Happstack中间件缺乏?

标签 haskell middleware happstack

我有常见的 happstack 情况,其中列表中有 ServerPart Response MonadPlus 。然后 msum 选择不会失败并生成并返回响应的那个。

我认为某些操作 - 例如检查 cookie - 准备连接上下文(授权经过身份验证的用户、实现计数等...)应该在任何传入请求中完成 - 甚至还没有定义任何路径信息。

也许有一些流行词我还不知道,特别是针对这类员工。有人可以建议吗?

最佳答案

如果您想对每个请求执行某些操作,您可以将它们添加到路由代码之前的 do 语句中。例如:

module Main where

import Happstack.Server

main = simpleHTTP nullConf $ do incCounter
                                mUser <- checkUserAuth
                                resp <- msum [ part1
                                             , part2
                                             , part3 mUser
                                             ]
                                logResponse resp
                                return resp

它将始终运行 incCountercheckUserAuth。然后它会尝试各种路线。

如果其中一条路由匹配,则会调用logResponse,最后返回resp发送给用户。

请注意,虽然 incCountercheckUserAuth 将始终运行,但 logResponse 仅在其中一个部分匹配时才会运行。如果没有,那么我很确定代码会转义并返回 404。如果您希望 logResponse 始终运行,那么您可以向 msum 添加一个处理程序总是匹配。例如:

                 resp <- msum [ part1
                              , part2
                              , part3 mUser
                              , notFound $ toResponse "Sorry, page not found."
                              ]

那几乎总是会运行。如果其中一个部分匹配,但显式调用“escape”,那么我很确定 logResponse 仍然不会运行。也有一些方法可以解决这个问题。

但是,简短的答案是,如果您希望某些事情在同一时间发生,只需将其放在 msum 代码之前即可。

关于haskell - Happstack中间件缺乏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13924273/

相关文章:

Haskell:打印文本编码

haskell - 与 monad 中的值进行模式匹配

ruby-on-rails - 暂存环境 : Password protect everything except for webhook

haskell - 什么是MACID?

haskell - QuickCheck 2 批处理

haskell - haskell中有没有一种方法可以通过多个参数和不同的顺序进行紧凑有效的比较

javascript - 我使用 Express 中间件收到 UnhandledPromiseRejection

ruby-on-rails-3 - 带有Rails 3的Hello World Rack 中间件: how to process body of all requests

c++ - cryptopp 外部库依赖

haskell - 使用 Reader 扩展 ServerPartT Monad