2

我有通常的 happstack 案例,其中我们有ServerPart Response MonadPlus列表和。然后msum选择没有失败并且响应生成并返回的那个。

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

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

4

1 回答 1

4

如果您想对每个请求执行某些操作,您可以在路由代码之前的 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将发送给用户的路由。

请注意,whileincCountercheckUserAuthwill 始终运行,logResponse只有在其中一个部分匹配时才会运行。如果没有,那么我很确定代码会转义并返回 404。如果您想logResponse始终运行,那么您可以向msum始终匹配的处理程序添加一个处理程序。例如:

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

那几乎总是会运行。如果其中一个部分匹配,但明确调用“escape”,那么我很确定logResponse仍然不会运行。也有处理这种情况的方法。

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

于 2012-12-18T04:41:32.537 回答