clojure 环中的重复评估
Duplication evaluation in clojure ring
我正在学习 Clojure Ring。这是我的第一个处理程序:
(ns long-hdi.core
(:gen-class))
(defn -main
"I don't do a whole lot ... yet."
[& args]
(println "Hello, World!"){:body "hello" :status 200})
(defn on-init[](println "Initializing..."))
(defn on-destroy[](println "destroying..."))
这是 project.clj 配置文件:
(defproject long-hdi "0.1.0-SNAPSHOT"
:description "FIXME: write description"
:url "http://example.com/FIXME"
:license {:name "Eclipse Public License"
:url "http://www.eclipse.org/legal/epl-v10.html"}
:dependencies [[org.clojure/clojure "1.8.0"]]
:plugins [[lein-ring "0.9.7"]]
:ring {:handler long-hdi.core/-main :init long-hdi.core/on-init :destroy long-hdi.core/on-destroy}
:main ^:skip-aot long-hdi.core
:target-path "target/%s"
:profiles {:uberjar {:aot :all}})
当我运行:
lein 环服务器无头
并浏览至 http://localhost:3000
我看到它在控制台上打印了两次 "Hello, world!"。为什么打印2次?我想它只打印一次。
然后我修改源码为:
...{:body args :status 200}...
然后使用 Google Chrome 浏览至 http://localhost:3000
这次,它在控制台上打印了 3 次 "Hello, world!"。为什么变成打印3次了?
我正在使用 REPL-y 0.3.7、nREPL 0.2.12、Clojure 1.8.0、lein-ring“0.9.7”、Windows 10-64 位。
问题不是因为你的代码而发生的,但我将在下面向你展示如何修改你的代码以获得你想要的结果。
要在这里进行更多调查,请打开 Chrome 开发工具 window(右键单击并 select "Inspect")。转到顶部的“网络”选项卡。在左侧,您会在请求列表下看到一些有趣的内容:localhost
以及 favicon.ico
。因此,实际上,每次重新加载浏览器时,它不仅会请求页面,还会请求页面图标,这就是为什么您会看到两个请求的原因。 Firefox(至少在我的情况下)只是在第一次加载后缓存图标,但 chrome 每次都从服务器请求它。
那么,你能做些什么呢?好吧,浏览器的每个 请求都会调用相同的 处理程序。因此,您接下来需要探索路线。这允许您将 specific 浏览器请求映射到 specific 处理程序。因此,您可以简单地避免调用以获取 favicon
。作为一个帮助您入门的小示例,它让您可以看到请求在浏览器中工作 window 而不是打印到命令行:
你的project.clj:
(defproject long-hdi "0.1.0-SNAPSHOT"
:dependencies [[org.clojure/clojure "1.8.0"]
[ring/ring-core "1.5.1"]
[ring/ring-jetty-adapter "1.5.1"]
[compojure "1.5.2"]]
:main long-hdi.core)
并且在您的主源文件中:
(ns long-hdi.core
(:require [ring.adapter.jetty]
[compojure.core :refer :all]))
(def counter (atom 0))
(defn handler
[req]
(swap! counter inc)
{:body (str "counter is: " @counter) :status 200})
(defroutes app
(GET "/" [] handler))
(defn -main [& args]
(ring.adapter.jetty/run-jetty app {:port 3000}))
运行 服务器,然后在浏览器 window 中打开它 localhost:3000
:
$ lein run
希望对您有所帮助,祝您玩得开心!
我正在学习 Clojure Ring。这是我的第一个处理程序:
(ns long-hdi.core
(:gen-class))
(defn -main
"I don't do a whole lot ... yet."
[& args]
(println "Hello, World!"){:body "hello" :status 200})
(defn on-init[](println "Initializing..."))
(defn on-destroy[](println "destroying..."))
这是 project.clj 配置文件:
(defproject long-hdi "0.1.0-SNAPSHOT"
:description "FIXME: write description"
:url "http://example.com/FIXME"
:license {:name "Eclipse Public License"
:url "http://www.eclipse.org/legal/epl-v10.html"}
:dependencies [[org.clojure/clojure "1.8.0"]]
:plugins [[lein-ring "0.9.7"]]
:ring {:handler long-hdi.core/-main :init long-hdi.core/on-init :destroy long-hdi.core/on-destroy}
:main ^:skip-aot long-hdi.core
:target-path "target/%s"
:profiles {:uberjar {:aot :all}})
当我运行: lein 环服务器无头 并浏览至 http://localhost:3000 我看到它在控制台上打印了两次 "Hello, world!"。为什么打印2次?我想它只打印一次。 然后我修改源码为:
...{:body args :status 200}...
然后使用 Google Chrome 浏览至 http://localhost:3000 这次,它在控制台上打印了 3 次 "Hello, world!"。为什么变成打印3次了?
我正在使用 REPL-y 0.3.7、nREPL 0.2.12、Clojure 1.8.0、lein-ring“0.9.7”、Windows 10-64 位。
问题不是因为你的代码而发生的,但我将在下面向你展示如何修改你的代码以获得你想要的结果。
要在这里进行更多调查,请打开 Chrome 开发工具 window(右键单击并 select "Inspect")。转到顶部的“网络”选项卡。在左侧,您会在请求列表下看到一些有趣的内容:localhost
以及 favicon.ico
。因此,实际上,每次重新加载浏览器时,它不仅会请求页面,还会请求页面图标,这就是为什么您会看到两个请求的原因。 Firefox(至少在我的情况下)只是在第一次加载后缓存图标,但 chrome 每次都从服务器请求它。
那么,你能做些什么呢?好吧,浏览器的每个 请求都会调用相同的 处理程序。因此,您接下来需要探索路线。这允许您将 specific 浏览器请求映射到 specific 处理程序。因此,您可以简单地避免调用以获取 favicon
。作为一个帮助您入门的小示例,它让您可以看到请求在浏览器中工作 window 而不是打印到命令行:
你的project.clj:
(defproject long-hdi "0.1.0-SNAPSHOT"
:dependencies [[org.clojure/clojure "1.8.0"]
[ring/ring-core "1.5.1"]
[ring/ring-jetty-adapter "1.5.1"]
[compojure "1.5.2"]]
:main long-hdi.core)
并且在您的主源文件中:
(ns long-hdi.core
(:require [ring.adapter.jetty]
[compojure.core :refer :all]))
(def counter (atom 0))
(defn handler
[req]
(swap! counter inc)
{:body (str "counter is: " @counter) :status 200})
(defroutes app
(GET "/" [] handler))
(defn -main [& args]
(ring.adapter.jetty/run-jetty app {:port 3000}))
运行 服务器,然后在浏览器 window 中打开它 localhost:3000
:
$ lein run
希望对您有所帮助,祝您玩得开心!