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)目录下的文件进行监控,并且自动加载。

posted @ 2011-12-14 10:23  MMJX  阅读(815)  评论(0编辑  收藏  举报