Websocket 无效事件“~#chsk/握手“;在clojure中使用sente packers.transit/get-transit-packer时

Websocket 无效事件“~#chsk/握手“;在clojure中使用sente packers.transit/get-transit-packer时,websocket,clojure,sente,Websocket,Clojure,Sente,我在使用sente时遇到一个错误,在将信息从客户端发送到服务器时导致失败,反之亦然。问题似乎是握手失败并出现错误 cljs$core$ExceptionInfo message: "Invalid event" data: {:given "~:chsk/handshake", :errors {:wrong-type {…}}} 连续的ws/ping也会因相同的错误而失败,但会有额外的信息 sente.cljc:142 Uncaught #error {:message "Inva

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

cljs$core$ExceptionInfo
  message: "Invalid event"
  data: {:given "~:chsk/handshake", :errors {:wrong-type {…}}}

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

sente.cljc:142 Uncaught #error {:message "Invalid event", :data {:given "~#'", :errors {:wrong-type 
{…}[:expected :vector]
   [:actual {:type #object[String], :value "~#'"}]
可能是什么问题,我的代码看起来很好,并且遵循顺序

预期行为: Sente将连接,我将能够调用
发送fn
,并在服务器和客户端之间成功发送消息

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

(需要“[taonesso.sente.server-adapters.aleph:参考(获取sch适配器)])
;; 在服务器中创建Websocket连接
(让[打包机(sente transit/get transit packer)
chsk服务器(sente/make通道套接字服务器!(获取sch适配器){:打包器打包器
:csrf令牌fn nil})
{:keys[ch recv send fn connected uids ajax post fn ajax get或ws handshake fn]}chsk server]
(def环ajax post ajax post fn)
(def ring ajax-get或ws-handshake ajax-get或ws-handshake fn)
(def ch chsk ch recv)
(def chsk发送!发送fn)
(def连接的UID连接的UID))
;;启动web服务器
(defn启动web服务器![&[port]]
(停止web服务器!)
(let[端口(或端口默认端口)
环处理程序(var主环处理程序)
[港口站fn]
(let[server(aleph/start服务器环处理程序{:port})
(承诺)]
(future@p)
[(aleph.netty/port服务器)
(fn[](.close^ Closeable server)(deliver p nil)))
uri(格式)http://localhost:%s/“港口]
(infof“Web服务器正在“%s”uri上运行)
(重置!web服务器{:端口:停止fn停止fn})
(试试看
(如果(和(支持桌面/IsdeskTop)
(.isSupported(桌面/getDesktop)桌面$Action/BROWSE))
(.browse(Desktop/getDesktop)(URI.URI))
(.exec(Runtime/getRuntime)(str“xdg open”uri)))
(线程/睡眠7500)
(捕捉无头异常)
在客户端:

(让[打包机(sente transit/get transit packer)
{:键[chsk ch recv send fn state]}
(sente/make channel socket client!“/chsk”
{:类型:自动
:封隔器封隔器})
(def chsk chsk)
(def ch chsk ch recv)
(def chsk发送!发送fn)
(def chsk状态)
;;启动路由器
(defn启动路由器![]
(停止路由器!)
(重置!路由器(发送/启动客户端chsk路由器!ch chsk事件消息处理程序)))
编辑、添加
我已经注意到,只有当我使用打包机时,错误才存在,
(packers.transit/get transit packer)
,而不是
:edn

不完全是答案,但我们必须查看您的代码。 此处生成错误“无效事件”:

(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))))
    ```

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

没有。我只是忘了包含
[com.cognitect/transit-cljs“0.8.256”]
cljs依赖项

该示例确实警告:

谢谢你的评论,我希望它能帮助其他人。在我的例子中,我已经在project.clj中包含了deps
[com.cognitect/transit-clj“0.8.313”][com.cognitect/transit-cljs“0.8.256”]
。我有完全相同的错误,所以我假设您的cljs构建工具可能没有正确地拾取它。您在应用程序加载的内置资源中看到transit CLJ了吗?您的cljs构建使用的是什么?谢谢您的保存!小错误真的会让人头疼。