問題タブ [phoenix-channels]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
464 参照

websocket - マルチテナント フェニックス チャネル

過去に、マルチテナント システムを実装し、要求ホスト ヘッダーを使用してテナント間でユーザーを分離しました。私の最初の考えは、同じアプローチを取ることでしたが、websocket を使用しましたが、いくつかの問題に遭遇しました。

1) ホスト ヘッダーが利用できないようです

2) トピック ID とチャネルの間には 1 対 1 の関係があります。つまり、2 つの異なるクライアントが異なるテナントから同じトピックに接続している場合 (例: messages:lobby)、他のテナント向けのメッセージを受信します。

Websocket 接続文字列にテナントを識別するクエリ パラメータを含めることで、(1) を解決できました。(2) は少しわかりにくいところです。トピックに名前空間を付けてテナントの識別子を含めることもできますが、トピックにはtenant1:messages:1232 つの変数があるため、 などの関数を一致させることはできませんtenant_id <> ":messages:" <> message_id。単一の関数でこれを回避できますが、多くのボイラープレートが進行中です。

マルチテナント websocket のためのより良い戦略はありますか?

0 投票する
0 に答える
558 参照

elixir - リロード後にチャンネル参加が重複する

プロジェクトで色の配布に Phoenix Channels を使用しましたが、次のようなエラーが発生し続けます。

複製方法:

  1. make install && make build
  2. 混合phoenix.server
  3. ウェブページを一度読み込むと、すべてが機能します
  4. リロードと新しい色のボタンが機能しなくなり、上記のメッセージがコンソールに表示されます..

コード:

バックエンド

フロント:

リポジトリ:

  1. フロント
  2. バックエンド
0 投票する
3 に答える
3961 参照

sockets - Phoenix Channels - ソケットごとに複数のチャネル

Elixir Channels を使用してリアルタイム イベントを処理するアプリケーションを作成しています。クライアントごとに 1 つのソケットが開かれ、複数のチャネルを多重化できることを理解しています。したがって、私のアプリは、ユーザーが複数のグループ チャットに参加するチャット アプリケーションです。join メソッドが動的トピックを処理する MessageChannel という 1 つの Phoenix Channel があります。

ジョンがグループ/トピック A と B に参加し、ボブがグループ/トピック B にのみ参加するとします。ジョンがグループ/トピック A にメッセージを送信するbroadcast!/3と、そのメッセージもボブに送信されますか? handle_inメッセージが送信されたトピック/グループのコンテキストがないためです。

グループ A に送信されたイベントをボブが受信しないようにするには、どうすればよいでしょうか。

0 投票する
0 に答える
855 参照

elixir - Phoenix - ソケットの接続、チャネルへの参加、プッシュ、別のアプリケーションからのメッセージの受信

学習目的で、コントローラの代わりに Phoenix Channels を使用して CRUD を行うこの単純な TODO アプリを作成listsしましたtodos:
https://chandothis.herokuapp.com/
コードはこちら:
https://github.com/iacobson/chan_do_this

今度は実験を続けて、別の Phoenix (または Elixir) アプリから既存の Heroku アプリにチャネル メッセージを送信します。たとえば、新しいリストを作成します。しかしここで困った。

Heroku ソケット (wss://chandothis.herokuapp.com/socket/websocket?token=undefined&vsn=1.0.0) に接続してチャネルに参加するにはどうすればよいですか?"lists"

更新 1
elixir_socket を使用してみました ( https://github.com/meh/elixir-socket )
{:ok, socket} = Socket.connect("wss://chandothis.herokuapp.com/socket/websocket")

{:ok, %Socket.Web{extensions: nil, headers: %{}, key: "Zm9yayB0aGUgZG9uZ2xlcw==", mask: true, origin: nil, path: "/socket/websocket", protocols: nil, socket: {:sslsocket, {:gen_tcp, #Port<0.7049>, :tls_connection, :undefined}, #PID<0.372.0>}, version: 13}}

{_, _, pid} = socket.socket

send pid, {:send, %{topic: "phoenix", event: "phx_join", payload: %{}}}

しかし、これを取得します:

[info] [83, 83, 76, 58, 32, 71, 111, 116, 32, 117, 110, 101, 120, 112, 101, 99, 116, 101, 100, 32, 105, 110, 102, 111, 58, 32, [123, [[123, ['send', 44, [35, 123, [['event', ' => ', [60, 60, '"phx_join"', 62, 62]], 44, 10, [' ', [' ', 32, 32, 32], 32, [32, [' ', 32, 32, ...], ' ', 32, 32, ...], 32, [' ', 32, 32, ...], ' ', 32, 32, ...], ['payload', ' => ', '\#{}'], 44, 10, [' ', [' ', 32, 32, ...], 32, [32, ...], 32, ...], ['topic', ' => ', [60, 60, '"phoenix"', ...]]], 125]], 125], 44, 10, [32, [32, [' ', 32, 32, 32], ' ', 32, 32, 32], 32, [' ', 32, 32, 32], ' ', 32, 32, 32], 'tcp_error', 44, '#Port<0.7049>'], 125], 32, '\n']

更新 2
Erlang websocket_client ( https://github.com/sanmiguel/websocket_client )
を使用した別の試みで、以下を例として使用しました:
https://github.com/phoenixframework/phoenix/blob/master/test/support/websocket_client.exs

{:ok, socket} = Phx.WebsocketClient.start_link(self(), "wss://chandothis.herokuapp.com/socket/websocket?token=undefined&vsn=1.0.0")
Phx.WebsocketClient.join(socket, "lists", %{})
次のエラーが発生します。

[error] State machine #PID<0.391.0> terminating Last message in was {:send, %{event: "phx_join", payload: %{}, ref: "1", topic: "lists"}} When State == :disconnected Data == {:context, {:websocket_req, :wss, 'chandothis.herokuapp.com', 443, '/socket/webs`enter code here`ocket?token=undefined&vsn=1.0.0', :infinity, :undefined, 1, :undefined, {:transport, :ssl, :ssl, :ssl_closed, :ssl_error, [mode: :binary, active: true, verify: :verify_none, packet: 0]}, "mR8BigxTXTlwBgxhiE63gA==", :undefined, :undefined, :undefined, :undefined, :undefined}, {:transport, :ssl, :ssl, :ssl_closed, :ssl_error, [mode: :binary, active: true, verify: :verify_none, packet: 0]}, [], {:wss, 'chandothis.herokuapp.com', 443, '/socket/websocket?token=undefined&vsn=1.0.0'}, {Phx.WebsocketClient, %{ref: 1, sender: #PID<0.384.0>}}, "", false, 0} Reason for termination = {:error, :disconnected}

0 投票する
1 に答える
93 参照

elixir - ボタンの色をリアルタイムで更新するにはどうすればよいですか?

ユーザーがログインすると、データベース内のすべてのテーブル (テーブルのボタン) が表示されます。テーブルには順序があります。したがって、ユーザーがテーブルをクリックすると、注文の作成パスにリダイレクトされ、注文が作成されるように機能します。または、テーブルに注文がある場合は、注文表示ページにリダイレクトされます。各注文には table_id があります。また、テーブルは、現在忙しいかどうかを色分けして表しています。

私がやりたいのは、テーブルボタンの色をリアルタイムで変更することです。1 人のユーザーが注文を作成すると、テーブルの色が変わるので、他のユーザーはすぐにそれを見ることができます。どうすればこれを達成できますか?私は世代サーバーとチャンネルを研究していますが、私はまだそれらの概念に慣れていません..これに関する提案はありますか?

前もって感謝します