私のPhoenixアプリケーションのユーザーチャンネルにメッセージを送信したかったのです。私はのusers:user_token
というチャンネルのuser_tokenに参加しました。私はブロードキャストメソッドを呼び出すことによってtoy_controller
という別のコントローラから成功させました。ブロードキャスト方法はユーザーチャネルにあります。イベントを処理するjQueryファイルを作成しました。私は、プロジェクトの外部から同じチャンネルにメッセージを送ることができるものを探していました。なぜなら、IoTのものをやりたかったからです。私はoccamy.socket
と呼ばれるPythonモジュールとPhoenixのJSクライアントを内部的に使用しようとしました。それから、私はいつも断線を見つけました。私はPhoenixからwebsocket接続の正確なアドレスを知ることができません。そのプロジェクトフォルダ自体のPhoenix npmライブラリで試してみると、常にReferenceError: window is not defined
と表示されます。そして、私はそれがあるため、それがPhoenixチャンネルプロジェクト外のクライアントからのメッセージを送信します。
let socket = new Socket("/socket", {params: {token: window.userToken}})
として書かれていますweb/static/js/socket.js
ファイル内のソケットの初期化部分であると思うが、私はわかりません。私が試してみました事は、私もこのアドレスに接続しようと切断エラーを得たのpythonのクライアントで
var Socket = require("phoenix-socket").Socket;
var socket = new Socket("ws://localhost:4000/socket");
を下回っています。私は、ユーザーのセンサーデータを監視するためにIoTの目的でそれを実行したいと考えています。各ユーザーには、監視対象のセンサーがあります。だから、チャネル
topic:subtopic
を
users:user_token
として設定しました。私はラズベリーパイからこのチャンネルにメッセージを送る必要があります。私のuser_channel、user.js、app.js、socket.jsを以下に示します。
//web/static/js/socket.js
import {Socket} from "phoenix"
let socket = new Socket("/socket", {params: {token: window.userToken}})
socket.connect()
export default socket
//web/static/app.js
import "phoenix_html"
import user from "./user"
#web/channels/user_channel.ex
defmodule Tworit.UserChannel do
use Tworit.Web, :channel
def join("users:" <> user_token, payload, socket) do
if authorized?(payload) do
{:ok, "Joined To User:#{user_token}", socket}
else
{:error, %{reason: "unauthorized"}}
end
end
def handle_in("ping", payload, socket) do
{:reply, {:ok, payload}, socket}
end
def handle_in("shout", payload, socket) do
broadcast socket, "shout", payload
{:noreply, socket}
end
def handle_out(event, payload, socket) do
push socket, event, payload
{:noreply, socket}
end
defp authorized?(_payload) do
true
end
def broadcast_change(toy, current_user) do
payload = %{
"name" => toy.name,
"body" => toy.body
}
Tworit.Endpoint.broadcast("users:#{current_user.token}", "change", payload)
end
end
//web/static/js/user.js
import socket from "./socket"
$(function() {
let ul = $("ul#em")
if (ul.length) {
var token = ul.data("id")
var topic = "users:" + token
\t \t
// Join the topic
let channel = socket.channel(topic, {})
channel.join()
.receive("ok", data => {
console.log("Joined topic", topic)
})
.receive("error", resp => {
console.log("Unable to join topic", topic)
})
channel.on("change", toy => {
\t console.log("Change:", toy);
\t $("#message").append(toy["name"])
})
}
});