首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在clojure中使用sente Packers.Transition/get-transit packer时,事件“~#chsk/握手”无效

在clojure中使用sente Packers.Transition/get-transit packer时,事件“~#chsk/握手”无效
EN

Stack Overflow用户
提问于 2020-03-31 09:26:54
回答 2查看 136关注 0票数 1

我在使用sente时收到一个错误,导致从客户端向服务器发送信息时失败,反之亦然。问题似乎是握手失败并出现错误

代码语言:javascript
运行
复制
cljs$core$ExceptionInfo
  message: "Invalid event"
  data: {:given "~:chsk/handshake", :errors {:wrong-type {…}}}

连续的ws/ping也失败,具有相同的错误但具有额外的信息,

代码语言:javascript
运行
复制
sente.cljc:142 Uncaught #error {:message "Invalid event", :data {:given "~#'", :errors {:wrong-type 
{…}[:expected :vector]
   [:actual {:type #object[String], :value "~#'"}]

可能的问题是什么,我的代码看起来没有问题,并且遵循发送的default example

预期行为:

发送将连接,我将能够调用send-fn并成功地在服务器和客户端之间发送消息。

编辑:添加注释中建议的代码:

代码语言:javascript
运行
复制
(require '[taoensso.sente.server-adapters.aleph :refer (get-sch-adapter)])
;; Create Websocket connection in server
(let [packer (sente-transit/get-transit-packer)
      chsk-server (sente/make-channel-socket-server! (get-sch-adapter) {:packer packer
                                                                        :csrf-token-fn nil})
      {:keys [ch-recv send-fn connected-uids ajax-post-fn ajax-get-or-ws-handshake-fn]} chsk-server]
  (def ring-ajax-post ajax-post-fn)
  (def ring-ajax-get-or-ws-handshake ajax-get-or-ws-handshake-fn)
  (def ch-chsk ch-recv)
  (def chsk-send! send-fn)
  (def connected-uids connected-uids))
代码语言:javascript
运行
复制
;; Start the web server
(defn start-web-server! [& [port]]
  (stop-web-server!)
  (let [port (or port default-port)
        ring-handler (var main-ring-handler)
        [port stop-fn]
        (let [server (aleph/start-server ring-handler {:port port})
              p (promise)]
          (future @p)
          [(aleph.netty/port server)
           (fn [] (.close ^Closeable server) (deliver p nil))])
        uri (format "http://localhost:%s/" port)]
    (infof "Web server is running at `%s`" uri)
    (reset! web-server_ {:port port :stop-fn stop-fn})
    (try
      (if (and (Desktop/isDesktopSupported)
               (.isSupported (Desktop/getDesktop) Desktop$Action/BROWSE))
        (.browse (Desktop/getDesktop) (URI. uri))
        (.exec (Runtime/getRuntime) (str "xdg-open" uri)))
      (Thread/sleep 7500)
      (catch HeadlessException _))))

在客户端:

代码语言:javascript
运行
复制
(let [packer (sente-transit/get-transit-packer)
      {:keys [chsk ch-recv send-fn state]}
      (sente/make-channel-socket-client! "/chsk"
                                         {:type   :auto
                                          :packer packer})]
  (def chsk chsk)
  (def ch-chsk ch-recv)
  (def chsk-send! send-fn)
  (def chsk-state state))
代码语言:javascript
运行
复制
;; start the router
(defn start-router! []
  (stop-router!)
  (reset! router_ (sente/start-client-chsk-router! ch-chsk event-msg-handler)))

编辑,添加

我已经注意到这个错误只存在于我使用打包器时,(packers.transit/get-transit-packer)而不是:edn

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-04-01 13:39:02

今天碰巧遇到了这个问题,所以在这个问题之后我有点挠头了,会不会是这个库没有太多的活动/是稳定的?

不是的。我只是忘记了包含[com.cognitect/transit-cljs "0.8.256"]类依赖项!

这个例子发出了警告:https://github.com/ptaoussanis/sente/blob/master/example-project/src/example/client.cljs#L47

票数 1
EN

Stack Overflow用户

发布于 2020-03-31 12:01:58

不是一个确切的答案,但我们要看看你的代码。这里会产生"Invalid event“错误:

代码语言:javascript
运行
复制
(defn validate-event
  "Returns nil if given argument is a valid [ev-id ?ev-data] form. Otherwise
  returns a map of validation errors like `{:wrong-type {:expected _ :actual _}}`."
  [x]
  (cond
    (not (vector? x))        {:wrong-type   (expected :vector x)}
    (not (#{1 2} (count x))) {:wrong-length (expected #{1 2}  x)}
    :else
    (let [[ev-id _] x]
      (cond
        (not (keyword? ev-id))  {:wrong-id-type   (expected :keyword            ev-id)}
        (not (namespace ev-id)) {:unnamespaced-id (expected :namespaced-keyword ev-id)}
        :else nil))))
    ```
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60942041

复制
相关文章

相似问题

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