首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何启用Fulcro Websockets

如何启用Fulcro Websockets
EN

Stack Overflow用户
提问于 2020-03-15 16:44:13
回答 1查看 218关注 0票数 2

关于如何开始使用支点和Websockets,我有一个基本的问题。

我从支点莱茵模板开始。(2)添加了websocket客户机和服务器位。在我的服务器中,我还添加了一个com.fulcrologic.fulcro.networking.websocket-protocols.WSListener来检测WS客户机何时连接。

WSListener和浏览器的网络控制台之间,我可以看到客户机从未建立WS连接。

  • 支点如何进行初始WS连接?
  • 在此之后,如何使服务器推送到客户端?

client.cljs

代码语言:javascript
复制
(ns foo.client
  (:require [fulcro.client :as fc]
            [foo.ui.root :as root]
            [fulcro.client.network :as net]
            [fulcro.client.data-fetch :as df]
            [com.fulcrologic.fulcro.networking.websockets :as fws]
            [com.fulcrologic.fulcro.application :as app]))

;; Neither this nor the below ":websocket (fws/fulcro-websocket-remote {})" works
;; (defonce app (app/fulcro-app {:remotes {:remote (fws/fulcro-websocket-remote {})}}))

(defonce SPA (atom nil))

(defn mount [] (reset! SPA (fc/mount @SPA root/Root "app")))
(defn start [] (mount))

(def secured-request-middleware
  ;; The CSRF token is embedded via server_components/html.clj
  (->
    (net/wrap-csrf-token (or js/fulcro_network_csrf_token "TOKEN-NOT-IN-HTML!"))
    (net/wrap-fulcro-request)))

(defn ^:export init []
  (reset! SPA (fc/make-fulcro-client
                {:client-did-mount (fn [foo]
                                     (df/load foo :all-users root/User))
                 ;; This ensures your client can talk to a CSRF-protected server.
                 ;; See middleware.clj to see how the token is embedded into the HTML
                 :networking       {:remote (net/fulcro-http-remote
                                              {:url                "/api"
                                               :request-middleware secured-request-middleware})
                                    :websocket (fws/fulcro-websocket-remote {})}}))
  (start))

middleware.cljs

代码语言:javascript
复制
(defrecord FooWSListener []
  WSListener
  (client-added [this ws-net cid]
    (println (str "Listener for dealing with client added events." [ws-net cid])))
  (client-dropped [this ws-net cid]
    (println (str "listener for dealing with client dropped events." [ws-net cid]))))

(def foo-ws-listener (->FooWSListener))

(def websockets' (atom nil))
(defn query-parser [env query] )

(defstate middleware
  :start
  (let [websockets (fws/start! (fws/make-websockets
                                 query-parser
                                 {:http-server-adapter (get-sch-adapter)
                                  :parser-accepts-env? true
                                  ;; See Sente for CSRF instructions
                                  :sente-options       {:csrf-token-fn nil}}))
        defaults-config (:ring.middleware/defaults-config config)
        legal-origins   (get config :legal-origins #{"localhost"})]

    (fwsp/add-listener websockets foo-ws-listener)
    (reset! websockets' websockets)

    (-> not-found-handler
        (wrap-api "/api")
        (fws/wrap-api websockets)
        server/wrap-transit-params
        server/wrap-transit-response
        (wrap-html-routes)
        (wrap-defaults defaults-config)
        wrap-gzip)))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-16 08:32:54

自支点-websockets 3.1.0以来的websocket连接是通过websocket远程进行的第一次数据传输。

如果要强制连接,可以通过在遥控器上发送任何突变来实现:

代码语言:javascript
复制
(:require [com.fulcrologic.fulcro.mutations :refer [defmutation]
          [com.fulcrologic.fulcro.components :as comp])

(defmutation connect-socket [_]
    (websocket [_] true))

(comment
    ;; trigger it via repl or a button handler
    (comp/transact! foo.client/SPA `[(connect-socket {})]

一旦建立了连接,就可以像这样从服务器上推送:

代码语言:javascript
复制
(:require [com.fulcrologic.fulcro.networking.websocket-protocols :refer [push]])

(let [client-uid (-> @(:connected-uids websockets')
                     :any
                     first)]
    (push websockets' client-uid :foo-topic {:foo "bar"}))

要在客户端上接收该消息,您需要在:push-handler远程上定义一个websocket

代码语言:javascript
复制
(defn push-handler [{:keys [topic msg] :as data}]
    (log/info "push-handler received: " data))

;; optionally you can listen for websocket state changes
(defn state-callback [before after]
    (log/info "state-callback: " {:before before
                                  :after after}))

(defn ^:export init []


 (reset! SPA (fc/make-fulcro-client
                {:client-did-mount (fn [foo]
                                     (df/load foo :all-users root/User))
                 :remotes          {:remote (net/fulcro-http-remote
                                              {:url                "/api"
                                               :request-middleware secured-request-middleware})
                                    :websocket (fws/fulcro-websocket-remote
                                                   {:push-handler push-handler
                                                    :state-callback state-callback})}}))
  (start))

顺便说一句,由于您使用的是模板提供的mount,您可以使用它来处理服务器上的websockets'

代码语言:javascript
复制
(defstate websockets'
  :start
  (fws/start! (fws/make-websockets
               query-parser
               {:http-server-adapter (get-sch-adapter)
                :parser-accepts-env? true})))

这样您就可以避免这一行:(reset! websockets' websockets)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60695250

复制
相关文章

相似问题

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