Недопустимое событие "~ # chsk / handshake" при использовании sente packers.transit / get-transition-packer в clojure - PullRequest
1 голос
/ 31 марта 2020

Я получаю сообщение об ошибке при использовании 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 подключится, и я смогу успешно позвонить send-fn и отправить сообщения между сервером и клиентом.

Редактировать: Добавление кода, как предлагается в комментариях:

(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))
;; 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 _))))

На стороне клиента:

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

Ответы [ 2 ]

1 голос
/ 01 апреля 2020

Сегодня по совпадению столкнулся с этой проблемой, поэтому после этой проблемы я немного почесал голову, может ли это быть библиотека, которая не видела большой активности / стабильна?

Нет. Я просто забыл включить зависимость [com.cognitect/transit-cljs "0.8.256"] cl js!

Пример предупреждал: https://github.com/ptaoussanis/sente/blob/master/example-project/src/example/client.cljs#L47

1 голос
/ 31 марта 2020

Не совсем ответ, но мы должны увидеть ваш код для этого. Ошибка «Недопустимое событие» генерируется здесь:

(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))))
    ```
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...