我有常见的 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
它将始终运行 incCounter
和 checkUserAuth
。然后它会尝试各种路线。
如果其中一条路由匹配,则会调用logResponse
,最后返回resp
发送给用户。
请注意,虽然 incCounter
和 checkUserAuth
将始终运行,但 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/