Clojure Web 开发一些注意事项
1. 使用Compojure开发的Web Server,怎么样绑定其端口?
现有的Clojure开发环境大致有2种,一种是Emacs下的开发,一种是ERPL下。Compojure可以利用lein和ring的结合,做到自动reload修改过的文件而不用重启服务器,因此大部分时候我们都使用lein ring server来启动我们的服务器,然而这种做法并没有提供绑定端口的方式,如果需要绑定到给定的端口,特别是1~1024这些需要特别权限的端口,我们需要使用别的方法。比如使用ring.util.serve方法:
:dev-dependencies [[ring-serve "0.1.0"]] user> (require 'your-app.core/handler) nil user> (use 'ring.util.serve) nil user> (serve your-app.core/handler) Started web server on port 3000
2. 不使用Compojure的hanler/site方法来包裹routes会出现什么后果。
handler/site方法自动会给用户定义的route添加如下middleware,如果不用handler/site方法,这些middleware将都不能起作用,奇怪的现象会出现。
- wrap-session - wrap-flash - wrap-cookies - wrap-multipart-params - wrap-params - wrap-nested-params - wrap-keyword-params
比如Destruct Params的时候会发现,:params, :query-params, 等都是空,只有query-string为请求的值。这个耽误了我很久的时间,做法很简单,加上handler/site方法包裹就可以了。
3. 如何让你的web server不重启就应用新的修改?
按照Compojure的官方文档所说,如果想默认的实现不重启web server就应用新的服务端代码的话,最好的办法就是用lein 和 ring的整合。ring中实现了对所有代码的自动重加载。不过事实上是大部分时候我们都不会使用这种方式来进行编程,因为lein的:ring参数后面并不能配置ssl链接,不能修改绑定端口等等。因此大部分时候我们是使用方法2的,也就是用ring.util.serve包在repl下运行我们的web server,并且实现一些交互。这样的话,我们就可以在core.clj中的main-routes定义中加入wrap-reload这个middleware来实现对:dir(默认是src)目录下的文件进行监控,并且自动加载。