【问题标题】:how to access / pass the request map in a moustache handler如何在 mustache 处理程序中访问/传递请求映射
【发布时间】:2012-09-11 10:18:06
【问题描述】:

我想创建一个接受两个输入的处理函数。一个是取自url/name的参数,第二个是来自查询字符串/name?x=3的参数

(def my-app (app
               [page-name] (handler page-name)))

(defn handler
  [{:keys [params]} page-name]
  (let [x (params "x")]
    (-> (page-templ page-name x) response constantly)))

上述失败是因为处理程序需要 2 个参数,但我只传递了一个。

如何获取请求映射并将其传递给处理程序?

上述案例中的请求映射包含一个名为x 的参数。

【问题讨论】:

    标签: clojure ring


    【解决方案1】:

    最好能在页面名称上进行调度,像这样:

    (app
     [""] (index-page)
     ["login"] (serve-login))
    

    这里的函数 index-page 和 serve-login 返回一个参数的函数。

    (defn index-page[]
      (fn [req] ..))
    

    req 是将包含键/值映射中所有 url 参数的请求。要获取参数值,请执行以下操作:

    (-> req (get :params) (get :x))
    

    所以完整的解决方案看起来像这样:

    (def my-app (app
                   ["page1-name"] (handler)))
    
    (defn handler []
      (fn [req]
        (let [x (-> req :params :x)]
          (-> (page-templ page-name x) response))))
    

    编辑:不要忘记将您的应用程序包装成 (wrap-keyword-params) 和 (wrap-params),您可以这样做:

    (def my-wrapped-app
      (-> my-app
       (wrap-keyword-params)
       (wrap-params))
    

    【讨论】:

    • 另一件事,如果响应取决于请求,则不应经常使用。 constantly 用于快速返回与请求无关的响应,这意味着它不关心您是否有任何参数。
    • 感谢您的回答,非常有帮助。现在我以上述方式定义我的所有功能。但是我无法让 wrap-keyword-params 工作。我仍然得到字符串键。我已将我的代码发布到github.com/murtaza52/hs-ex
    • 抱歉无法让您的网络应用程序运行,但我认为如果您在应用程序宏中指定包装器,您需要颠倒它们的顺序:(app (wrap-params) (wrap-keyword-params ) [""] (服务索引))
    • 是的,那将是错误的。让我纠正一下。另外,您是如何尝试运行它的?另外我有两条路线 [""] 和 ["/"],都指向同一个处理程序 (serve-index),有没有办法为两者指定一条路线而不是两条单独的路线?
    • 你不需要为“/”设置路由,只在“”上调度。对于更深的级别,请使用 ["level1" "level2"] 之类的内容,这对应于 URL 主机/级别 1/级别 2。回答您的第一个问题,我克隆了您的存储库并执行了 lein repl,我看到您在 project.clj 中有钩子,它无法加载模板。
    猜你喜欢
    • 1970-01-01
    • 2016-08-08
    • 1970-01-01
    • 1970-01-01
    • 2020-08-31
    • 2013-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多