首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >http-kit websocket解析符号

http-kit websocket解析符号
EN

Stack Overflow用户
提问于 2015-11-28 10:14:11
回答 1查看 266关注 0票数 0

问题:当我在下面的代码中调用调用者函数时,如果我通过json从javascript套接字客户端传递数据,我会得到一个空指针异常。当我从repl运行相同的代码,并向它传递相同的数据时,我没有得到错误。

在repl中:

代码语言:javascript
复制
(def data (json/write-str {:controller "hql" :function "something"}))
(caller data)

这个很好用

From javascript:当从处理程序调用函数调用者时,这会给我一个空指针异常。

代码语言:javascript
复制
<script>
var msg = {'controller': 'hql','function':'something'};
socket = new WebSocket('ws://192.168.0.7:9090');
socket.onopen = function() {
  socket.send(JSON.stringify(msg));
}
socket.onmessage = function(s) {
 console.log(s);
 socket.close();
}
socket.onclose = function() {
  console.log('Connection Closed');
}
</script>

(ns hqlserver.core
 (:use [org.httpkit.dbcp :only [use-database! close-database! insert-record update-values query delete-rows]]
       [org.httpkit.server])
 (:require [clojure.data.json :as json]))

(defn hql [data]
 (use-database! "jdbc:mysql://localhost/xxxx" "user" "xxxxx")
 (let [rows (query ("select username,firstname,lastname from users order by lastname,firstname")]
 (close-database!)
 (json/write-str rows)))

(defn get-controller [data]
 (if data
   (let [data (json/read-str data :key-fn keyword)]
     (data :controller))))

(defn caller [data]
  ((ns-resolve *ns* (symbol (get-controller data))) data))

(defn handler [request]
 (with-channel request channel
   (on-close channel (fn [status] (println "channel closed: " status)))
   (on-receive channel (fn [data] (send! channel (caller data))))))

 (defn -main [& args]
   (run-server handler {:port 9090}))
EN

回答 1

Stack Overflow用户

发布于 2015-11-29 14:35:07

不知道这是不是最好的方法,但这就是解决方案:感谢noisesmith的帮助和提示……

代码语言:javascript
复制
(ns hqlserver.core
(:use [org.httpkit.dbcp :only [use-database! close-database! insert-   record update-values query delete-rows]]
    [org.httpkit.server]
    [hqlserver.s300.login :only [login]])
(:require [clojure.data.json :as json]
        [hqlserver.s300.site :refer [site-index site-update]]
        [clojure.string :as str]))

(defn get-site [data]
 (if data
   (let [data (json/read-str data :key-fn keyword)]
     (-> data :site))))

(defn get-controller [data]
  (if data
    (let [data (json/read-str data :key-fn keyword)]
      (-> data :controller))))

(defn get-function [data]
  (if data
    (let [data (json/read-str data :key-fn keyword)]
      (-> data :function))))

(defn caller [data]
 (let [site (get-site data)]
   (let [controller (get-controller data)]
     (let [function (get-function data)]
       (cond
         (and (= site "s300")(= controller "login")(= function "login")) (login data)
         (and (= site "s300")(= controller "site")(= function "site-index")) (site-index data)
         (and (= site "s300")(= controller "site")(= function "site-update")) (site-update data)
         :else (json/write-str {:error "No records found!"}))))))

(defn async-handler [ring-request]
  (with-channel ring-request channel
    (if (websocket? channel)
      (on-receive channel (fn [data]
                        (send! channel (caller data))))
      (send! channel {:status 200
                  :headers {"Content-Type" "text/plain"}
                  :body    "Long polling?"}))))

(defn -main [& args]
 (run-server async-handler {:port 9090}));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33966978

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档