当我在环形码头服务器中运行Web应用程序时,我得到了EOF异常,我无法解决这个问题,因为没有关于错误发生在哪一行的线索.我在我的clojure代码上使用compojure和hiccup.我正在使用Emacs 23作为编辑器.
以下是例外的一部分:
Exception in thread "main" java.lang.Exception: EOF while reading (core.clj:66)
at clojure.lang.Compiler.load(Compiler.java:5863)
at clojure.lang.RT.loadResourceScript(RT.java:340)
at clojure.lang.RT.loadResourceScript(RT.java:331)
.................
............
.........
.....
Run Code Online (Sandbox Code Playgroud)
我该如何解决?谢谢!
在不重新启动整个JVM的情况下,将新代码推送到生产环服务器的最佳方法是什么?
目前我在生产中使用wrap-reload,但这对我来说并不适用,因为有时我想在ring开始使用新代码处理请求之前在repl中运行命令(例如进行数据库迁移).此外,各种博客和教程都说不要在生产中使用wrap-reload,尽管我不明白为什么不这样做.
我已经提出了以下解决方案,但我承认我并不深入了解引擎盖下发生了什么.我想知道我是否可以得到一个人的理智检查.这种技术看起来合理吗?
这个想法是有一个路径(/ admin/reload-clj)导致所有的clojure代码被重新加载.
(defonce ^:dynamic *jetty*)
(declare reload-clj)
(defn app [req]
...
(when (= (req :uri) "/admin/reload-clj") (reload-clj req))
...)
(defn start-jetty []
(let [j (run-jetty app {:port (http-port) :join? false :max-threads 16})]
(dosync (ref-set *jetty* j))
j))
(defn reload-clj [req]
(future
(log/info "Reloading clojure code...")
(require '(whrusrv admin main utils wdb) :reload-all)
(.stop @*jetty*)
(start-jetty)
(log/info "Clojure reload success!"))
{:status 200
:headers {"Content-Type" "text/plain"}
:body "Reloading..."})
(defn -main [& args]
(start-jetty))
Run Code Online (Sandbox Code Playgroud) 在环形应用程序中处理异常的惯用方法是什么?我想捕获异常并返回500页.我怎么做 ?
我在下面的代码中使用小胡子,但它不起作用 -
(def my-app (try
(app
(wrap-logger true)
wrap-keyword-params
wrap-params
wrap-file-info
(wrap-file "resources/public/")
[""] (index-route @prev-h nil)
["getContent"] (fetch-url)
["about"] "We are freaking cool man !!"
[&] (-> "Nothing was found" response (status 404) constantly))
(catch Exception e
(app
[&] (-> "This is an error" response (status 500) constantly)))
Run Code Online (Sandbox Code Playgroud) 是否有任何可用的环中间件可以模仿像apache这样的标准文件服务器处理路由的方式
所以处理程序看起来像这样:
(wrap-dir "resources/public/")
Run Code Online (Sandbox Code Playgroud)
这非常相似
(wrap-file "resources/public/")
Run Code Online (Sandbox Code Playgroud)
但也会输出目录列表.
我一直在阅读edn规范,并希望将它集成到我的应用程序中.但是,我不知道如何在clojure和客户端之间传输edn请求.我们是否在响应头中放入了内容类型的application/edn并只发送了prn输出字符串?
我有一个需要的Ring处理程序:
现在我有点工作,但只有第一个压缩条目被流式传输,然后停止/停止.我觉得它与刷新/流媒体有关,这是错误的.
这是我的(compojure)处理程序:
(GET "/zip" {:as request}
:query-params [order-id :- s/Any]
(stream-lessons-zip (read-string order-id) (:db request) (:auth-user request)))
Run Code Online (Sandbox Code Playgroud)
这是stream-lessons-zip函数:
(defn stream-lessons-zip
[]
(let [lessons ...];... not shown
{:status 200
:headers {"Content-Type" "application/zip, application/octet-stream"
"Content-Disposition" (str "attachment; filename=\"files.zip\"")
:body (futil/zip-lessons lessons)}))
Run Code Online (Sandbox Code Playgroud)
我使用管道输入流来进行流式处理:
(defn zip-lessons
"Returns an inputstream (piped-input-stream) to be used directly in Ring HTTP responses"
[lessons]
(let [paths (map #(select-keys % [:file_path :file_name]) lessons)]
(ring-io/piped-input-stream
(fn [output-stream]
; build a zip-output-stream from a normal output-stream
(with-open [zip-output-stream (ZipOutputStream. …Run Code Online (Sandbox Code Playgroud) 我知道可以使用创建war文件lein ring war,但它似乎仍然包含jetty依赖项.当我构建战争(并在tomcat上部署)时,有没有办法排除jetty依赖项?
如果我不能做到这一点,或者只是额外的罐子/类文件被打包到战争中但从未真正使用过?
我很惊讶地发现我的铃声应用程序没有正确服务utf-8.我把它减少到一个简单的测试用例,有没有人知道如何确保这总是将utf-8返回给浏览器?
(ns utf8test.core)
(defn app
[request]
{:status 200 :body "???"})
Run Code Online (Sandbox Code Playgroud)
在project.clj中(使用lein-ring插件):
:ring {:handler utf8test.core/app}
Run Code Online (Sandbox Code Playgroud)
在终端:
> lein ring server
Run Code Online (Sandbox Code Playgroud)
--->ɮѪÏ'(这是错误的,应该是ɮѪΘ)
优选地,也是一种适用于tomcat的方法,因为这是部署app的地方.
谢谢!
在开发基于组件/环的clojure应用程序时,emacs/cider的正确工作流程/使用途径是什么?
我觉得我可以"附加"到我正在运行的compojure/ring-process,更改其代码,读取/更改其数据,但我无法理解我该如何做到这一点?什么是正确的方法?
我所做的?
lein new compojure my-project
cd my-project
lein ring server-headless
Run Code Online (Sandbox Code Playgroud)
开发服务器现在运行.如果我更改项目中的文件,它们将自动重新加载.那很好.但我想要的是,我直接附加到流程并更改其功能,例如.
我明白这是可能的,但我无法理解.
我想用figwheel重新加载我正在玩的全部项目的前端.
后端提供REST api,并组织为一组组件,我在我的main函数中创建一个系统(我使用duct来创建处理程序组件).我想使用闭包将状态传递给我的处理程序,但配置figwheel以使用我的处理程序的唯一方法似乎是设置ring-handler密钥project.clj,这需要我在lein启动时传递在命名空间中定义的处理程序.
那么 - 当我进行组件启动时,有没有办法配置figwheel?我在Closure仍然很新,所以我很可能会错过一些看得见的东西.
将状态作为参数传递给环处理程序?是一个类似的问题,但答案是涉及将处理程序绑定到命名空间顶层的var,我正在努力避免.