我经常遇到这样的情况,我们在list和.中有ServerPart Response MonadPlus。然后,msum选择没有失败的那个,并生成并返回响应。
我认为一些操作-比如检查cookies准备连接上下文(授权经过身份验证的用户,实现计数等)应该在任何传入的请求中完成-甚至还没有定义任何路径信息。
也许有一些时髦的词我还不知道,特别是对于这种类型的员工。有人能给点建议吗?
发布于 2012-12-18 12:41:33
如果您希望对每个请求执行某些操作,则可以在路由代码之前的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代码之前。
https://stackoverflow.com/questions/13924273
复制相似问题