Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 如何将http.kit服务器与drawbridge环处理程序一起使用?_Clojure_Ring_Http Kit - Fatal编程技术网

Clojure 如何将http.kit服务器与drawbridge环处理程序一起使用?

Clojure 如何将http.kit服务器与drawbridge环处理程序一起使用?,clojure,ring,http-kit,Clojure,Ring,Http Kit,我有以下服务器代码: (ns tweet-sentiment.server (:require [clojure.java.io :as io] [tweet-sentiment.dev :refer [is-dev? inject-devmode-html browser-repl start-figwheel start-less]] [compojure.core :refer [GET POST defroutes]]

我有以下服务器代码:

(ns tweet-sentiment.server
(:require [clojure.java.io :as io]
            [tweet-sentiment.dev :refer [is-dev? inject-devmode-html browser-repl start-figwheel start-less]]
            [compojure.core :refer [GET POST defroutes]]
            [compojure.route :refer [resources]]
            [net.cgrand.enlive-html :refer [deftemplate]]
            [net.cgrand.reload :refer [auto-reload]]
            [ring.middleware.reload :as reload]
            [ring.middleware.defaults :refer [wrap-defaults api-defaults]]
            [tweet-sentiment.utils :refer [generate-response]]
            [environ.core :refer [env]]
            [org.httpkit.server :refer [run-server]]
            [ring.middleware.edn :refer [wrap-edn-params]]
            [tweet-sentiment.tweets :refer [tweets]]
            [tweet-sentiment.dandelion :refer [dandelion-sentiment]]
            [clojure.core.async :refer [>!! <!! put! take! pipe chan]]
            [cemerick.drawbridge :as drawbridge]
            [ring.middleware.basic-authentication :refer [wrap-basic-authentication]]
            )
  (:gen-class))

(defonce server (atom nil))

(deftemplate page (io/resource "index.html") []
             [:body] (if is-dev? inject-devmode-html identity))

(defroutes routes
           (resources "/")
           (resources "/react" {:root "react"})
           (GET "/*" req (page)))


(defn wrap-drawbridge [handler]
  (fn [req]
    (if (= "/repl" (:uri req))
      (drawbridge/ring-handler req)
      (handler req))))

(def http-handler
  (if is-dev?
    (-> #'routes
        (wrap-defaults api-defaults)
        reload/wrap-reload
        wrap-edn-params
        wrap-drawbridge)

    (-> (wrap-defaults #'routes api-defaults)
        wrap-edn-params
        wrap-drawbridge)))

(defn run-web-server [& [port]]
  (let [port (Integer. (or port (env :port) 10555))]
    (println (format "Starting web server on port %d." port))
    (reset! server (run-server http-handler {:port port :join? false}))))

(defn run-auto-reload [& [port]]
  (auto-reload *ns*)
  (start-figwheel)
  (start-less))

(defn run [& [port]]
  (when is-dev?
    (run-auto-reload))
  (run-web-server port))

(defn stop-server []
  (when-not (nil? @server)
    (@server :timeout 0)
    (reset! server nil)))

(defn restart-server []
  (stop-server)
  (run-web-server))

(defn -main [& [port]]
  (run port))
问题显然出在
吊桥/吊环处理程序
函数中。
这些是我的依赖项:

[[org.clojure/clojure "1.6.0"]
                 [org.clojure/clojurescript "0.0-3058" :scope "provided"]
                 [ring "1.3.2"]
                 [ring/ring-defaults "0.1.4"]
                 [compojure "1.3.2"]
                 [enlive "1.1.6"]
                 [org.omcljs/om "0.8.8"]
                 [om-sync "0.1.1"]
                 [environ "1.0.0"]
                 [http-kit "2.1.19"]
                 [fogus/ring-edn "0.3.0"]
                 [prismatic/om-tools "0.3.11"]
                 [secretary "1.2.3"]
                 [sablono "0.3.4"]
                 [twitter-api "0.7.8"]
                 [racehub/om-bootstrap "0.5.3"]
                 [cheshire "5.2.0"]
                 [com.cemerick/drawbridge "0.0.7"]
                 [ring-basic-authentication "1.0.1"]]

有人使用drawbrige使用http.kit服务器吗?我错过了什么

我终于明白了,服务器文件应该是这样的

(ns tweet-sentiment.server
  (:require [clojure.java.io :as io]
            [tweet-sentiment.dev :refer [is-dev? inject-devmode-html browser-repl start-figwheel start-less]]
            [compojure.core :refer [GET POST defroutes]]
            [compojure.route :refer [resources]]
            [net.cgrand.enlive-html :refer [deftemplate]]
            [net.cgrand.reload :refer [auto-reload]]
            [ring.middleware.reload :as reload]
            [ring.middleware.defaults :refer [wrap-defaults api-defaults]]
            [tweet-sentiment.utils :refer [generate-response]]
            [environ.core :refer [env]]
            [org.httpkit.server :refer [run-server]]
            [ring.middleware.edn :refer [wrap-edn-params]]
            [clojure.core.async :refer [>!! <!! put! take! pipe chan]]
            [cemerick.drawbridge :as drawbridge]
            [ring.middleware.basic-authentication :refer [wrap-basic-authentication]]
            [ring.middleware.params :as params]
            [ring.middleware.keyword-params :as keyword-params]
            [ring.middleware.nested-params :as nested-params]
            [ring.middleware.session :as session]
            )
  (:gen-class))

(defonce server (atom nil))

(deftemplate page (io/resource "index.html") []
             [:body] (if is-dev? inject-devmode-html identity))

(defroutes routes
           (resources "/")
           (resources "/react" {:root "react"})
           (GET "/*" req (page)))

(defn authenticated? [name pass]
  (= [name pass] [(System/getenv "AUTH_USER") (System/getenv "AUTH_PASS")]))

(def drawbridge-handler
  (-> (drawbridge/ring-handler)
      (keyword-params/wrap-keyword-params)
      (nested-params/wrap-nested-params)
      (params/wrap-params)
      (session/wrap-session)))

(defn http-handler [handler]
  (-> handler
      (wrap-defaults api-defaults)
      wrap-edn-params))

(defn wrap-http [handler]
  (fn [req]
    (let [handler (if (= "/repl" (:uri req))
                    (wrap-basic-authentication drawbridge-handler authenticated?)
                    (if is-dev?
                      (-> handler
                          http-handler
                          reload/wrap-reload)
                      (-> handler
                          http-handler)))]
      (handler req))))

(defn run-web-server [& [port]]
  (let [port (Integer. (or port (env :port) 10555))]
    (println (format "Starting web server on port %d." port))
    (reset! server
            (run-server (wrap-http #'routes) {:port port :join? false})
            )))

(defn run-auto-reload [& [port]]
  (auto-reload *ns*)
  (start-figwheel)
  (start-less))

(defn run [& [port]]
  (when is-dev?
    (run-auto-reload))
  (run-web-server port))

(defn stop-server []
  (when-not (nil? @server)
    (@server :timeout 0)
    (reset! server nil)))

(defn restart-server []
  (stop-server)
  (run-web-server))

(defn -main [& [port]]
  (run port))
(ns tweet-touction.server)
(:require[clojure.java.io:as-io]
[tweet-touction.dev:refere[is dev?inject devmode html浏览器repl start figwheel start less]]
[compojure.core:参考[GET POST defroutes]]
[compojure.route:参考[参考资料]]
[net.cgrand.enlive-html:请参阅[deftemplate]]
[net.cgrand.reload:参考[自动重新加载]]
[ring.middleware.reload:as reload]
[ring.middleware.defaults:参考[wrap defaults api defaults]]
[tweet-touction.utils:参考[生成响应]]
[环境核心:参考[环境]]
[org.httpkit.server:参考[运行服务器]]
[ring.middleware.edn:参考[wrap edn params]]
[clojure.core.async:参考[>!!(吊桥/吊环处理器)
(关键字参数/换行关键字参数)
(嵌套参数/换行嵌套参数)
(参数/包裹参数)
(会议/总结会议)
(defn http处理程序[处理程序]
(->处理器
(包装默认值api默认值)
包裹edn参数)
(defn wrap http[handler]
(fn[req]
(let[handler(if(“/repl”(:uri req))
(包装基本验证吊桥处理程序已验证?)
(如果是dev?
(->处理器
http处理程序
重新加载/包裹(重新加载)
(->处理器
http处理程序])]
(处理程序请求)
(defn运行web服务器[&[port]]
(让[端口(整数)(或端口(环境:端口)10555))]
(println(格式为“在端口%d上启动web服务器”。端口))
(重置!服务器
(运行服务器(包装http#'路由){:端口:连接?错误})
)))
(defn运行自动重新加载[&[port]]
(自动重新加载*ns*)
(启动figwheel)
(从零开始)
(defn运行[&[port]]
(戴夫什么时候来?
(运行自动重新加载)
(运行web服务器端口)
(defn停止服务器[]
(如果不是(nil?@server)
(@server:timeout 0)
(重置!服务器为零)
(defn重新启动服务器[]
(停止服务器)
(运行web服务器)
(defn-主[&[端口])
(运行端口)

这个问题和答案很有帮助,因为我可以研究它并最终找到我的错误,但也许一个摘要也很有用。你需要做的是:-使用drawbridge的环处理程序并将其包装在适当的包装中(参见上面的drawbridge处理程序函数)-将其放入wrap基本身份验证-不要用更多的东西包装它。只需制作一个非此即彼/或。应用程序或drawbridge repl。也就是说,使wrap drawbridge成为最后一个!这对我很有效。
(ns tweet-sentiment.server
  (:require [clojure.java.io :as io]
            [tweet-sentiment.dev :refer [is-dev? inject-devmode-html browser-repl start-figwheel start-less]]
            [compojure.core :refer [GET POST defroutes]]
            [compojure.route :refer [resources]]
            [net.cgrand.enlive-html :refer [deftemplate]]
            [net.cgrand.reload :refer [auto-reload]]
            [ring.middleware.reload :as reload]
            [ring.middleware.defaults :refer [wrap-defaults api-defaults]]
            [tweet-sentiment.utils :refer [generate-response]]
            [environ.core :refer [env]]
            [org.httpkit.server :refer [run-server]]
            [ring.middleware.edn :refer [wrap-edn-params]]
            [clojure.core.async :refer [>!! <!! put! take! pipe chan]]
            [cemerick.drawbridge :as drawbridge]
            [ring.middleware.basic-authentication :refer [wrap-basic-authentication]]
            [ring.middleware.params :as params]
            [ring.middleware.keyword-params :as keyword-params]
            [ring.middleware.nested-params :as nested-params]
            [ring.middleware.session :as session]
            )
  (:gen-class))

(defonce server (atom nil))

(deftemplate page (io/resource "index.html") []
             [:body] (if is-dev? inject-devmode-html identity))

(defroutes routes
           (resources "/")
           (resources "/react" {:root "react"})
           (GET "/*" req (page)))

(defn authenticated? [name pass]
  (= [name pass] [(System/getenv "AUTH_USER") (System/getenv "AUTH_PASS")]))

(def drawbridge-handler
  (-> (drawbridge/ring-handler)
      (keyword-params/wrap-keyword-params)
      (nested-params/wrap-nested-params)
      (params/wrap-params)
      (session/wrap-session)))

(defn http-handler [handler]
  (-> handler
      (wrap-defaults api-defaults)
      wrap-edn-params))

(defn wrap-http [handler]
  (fn [req]
    (let [handler (if (= "/repl" (:uri req))
                    (wrap-basic-authentication drawbridge-handler authenticated?)
                    (if is-dev?
                      (-> handler
                          http-handler
                          reload/wrap-reload)
                      (-> handler
                          http-handler)))]
      (handler req))))

(defn run-web-server [& [port]]
  (let [port (Integer. (or port (env :port) 10555))]
    (println (format "Starting web server on port %d." port))
    (reset! server
            (run-server (wrap-http #'routes) {:port port :join? false})
            )))

(defn run-auto-reload [& [port]]
  (auto-reload *ns*)
  (start-figwheel)
  (start-less))

(defn run [& [port]]
  (when is-dev?
    (run-auto-reload))
  (run-web-server port))

(defn stop-server []
  (when-not (nil? @server)
    (@server :timeout 0)
    (reset! server nil)))

(defn restart-server []
  (stop-server)
  (run-web-server))

(defn -main [& [port]]
  (run port))