我有通常的 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
代码之前即可。