おい、
JSの例にエラーがあるようだということをお知らせしたかっただけです。
node.jsサーバーでこれを機能させようとしています。 (JSエキスパートではありません)
以下のコードブロックは私には機能しません。
import { Socket } = '@supabase/realtime-js'
const REALTIME_URL = process.env.REALTIME_URL || 'http://localhost:4000'
var socket = new Socket(REALTIME_URL)
socket.connect()
// Listen to only INSERTS on the 'users' table in the 'public' schema
var allChanges = this.socket.channel('realtime:public:users')
.join()
.on('INSERT', payload => { console.log('Update received!', payload) })
代わりに機能するのは次のとおりです。
const { Socket } = require('@supabase/realtime-js'); // related to node/browser difference?
const REALTIME_URL = process.env.REALTIME_URL || 'http://localhost:4000/socket' // "/socket" had to be added
var socket = new Socket(REALTIME_URL)
socket.connect()
var allChanges = socket.channel('realtime:public:users') // removed "this." here (related to node/browser difference?)
.join()
.channel // added ".channel" because "join()" returns Push object
.on('INSERT', payload => { console.log('Record inserted!', payload) })
素晴らしいlibをありがとう:)
ねえ@retendo ! それを機能させるのに十分長く持続してくれてありがとう。
// related to node/browser difference?
あなたはそれを釘付けにしました。 上の例は「ブラウザ」JSの例で、下の例は「サーバー」JSの例です。
JSの短い(完全に正確ではない)歴史として:最初は、Javascriptはブラウザで小さなこと(小さなアニメーション)を行うためにのみ実際に使用されていました。 それから人々はそれでウェブサイト全体を構築し始めました。
それからグーグルは考えました..多分私達はブラウザだけでなくサーバー上でもこのJSを実行することができますか? そこで、Javascriptの「サブセット」であるnodejsを作成し、それを実行できるv8
という「エンジン」を作成しました。
しかし、NodeJSには実際には同じ「方言」がありません。 (CommonJS vs AMD vs UMDを調べてください。)これが、babelのようなツールが存在する理由です。 それらは、異なるJS方言間でJSを「変換」します。
とにかく-あなたはノードのrequire('@supabase/realtime-js');
でそれを釘付けにしました
簡単な例が機能している場合は、 /examples
フォルダーにnode-js
例として追加することもできますか? 私たちは貢献者に非常にオープンです。
より重要な変更は、join()とon(...)の間の「.channel」であるべきだと思います。
これは、node.js / browserの違いとは関係がないようです。
それとも、これはブラウザで何らかの形で機能していますか?
.join()は、チャネルではなくプッシュオブジェクトを返すようです。
これをチェックする必要があります。 フォークできる既存のリポジトリはありますか? プライベートで問題がない場合は、このリポジトリで小さなエクスプレスデモを作成します
ここにいくつかのサンプルコードがあります:
https://gist.github.com/retendo/3e2ddb90a29dfd0f5a2ab81729c7ed29
これは、調整されたサンプルコードで機能します
それに加えて、ワイルドカートパスはチャネルパスでは機能しません。
socket.channel( 'realtime:public:users')->動作します
socket.channel( ' ')->壊れていますsocket.channel( 'realtime: ')->壊れています
socket.channel( 'realtime:public:*')->壊れています
ただし、socket.channel( 'realtime:public')は機能します。 最後のコロンを省略してください。
ちょっと@retendo連絡が取れないことをお詫びします-私はこれを見て、基本的なnodejsの例を作成していますが、おそらく明日の朝まで終わらないでしょう。
参考:これらは機能しないはずです
socket.channel('') -> broken
socket.channel('realtime:') -> broken
socket.channel('realtime:public:*') -> broken (see realtime:public below)
しかし、これらは
socket.channel('realtime:*') -> listen to changes in the database
socket.channel('realtime:public') -> listen to changes in the public schema
socket.channel('realtime:public:users') -> listen to changes in the users table
「オン」を使用して、さまざまな「イベントタイプ」をリッスンします。 要点でコードを使用する:
// INSERTS
socket.channel('realtime:public')
.join()
.channel
.on('INSERT', payload => {});
// UPDATES
socket.channel('realtime:public')
.join()
.channel
.on('UPDATE', payload => {});
// DELETES
socket.channel('realtime:public')
.join()
.channel
.on('DELETE', payload => {});
// ALL
socket.channel('realtime:public')
.join()
.channel
.on('*', payload => {});
それが少し役立つことを願っています! 私はまだあなたのコードをテストしていませんが、それは素晴らしく見えます! 私はあなたがそれをどこに向かっているのかを正確に理解しています-プロキシを作成します(おそらく認証目的のためですか?)
認証の場合、基盤となるデータベース構造といくつかのペイロードの変更を隠す特殊なソケットAPI。
小さな例が@retendoにプッシュされました。 私はあなたのコードをベースラインとして使用したので、貢献してくれてありがとう
より重要な変更は、join()とon(...)の間の「.channel」であると考えてください。
最初のコミットと2番目のコミットの違いを確認してください: https :
基本的に、 socket.channel()
はチャネルを返し、 socket.channel.join()
は参加イベントを返します。 つまり、 join
イベントを通じてチャンネルに「アクセス」していました。
プロキシを更新してください。十分に汎用性を維持できる場合は、 examples
フォルダーに追加します。
それは理にかなっている。 元のブラウザベースの例では、すべてがチェーンされていたので、そのように複製しようとしました。 しかし、2番目のコミットの変更により、実際にはそれがより明確になります。
プロキシの例について:私に何ができるかを見ていきます。 あなたはおそらく、認証がどのように全体像に適合するかに最も興味がありますよね? 私が言及した他のことは簡単なはずだからです。
ええ、特に認可において。 現在取り組んでいるので、より多くの視点やアプローチを得るのは良いことです。
ここに売り込んでくれてありがとう。 他に問題が発生した場合は、お知らせください。 何か残っていない限り、これを閉じておきます
今すぐ締めくくり、いつでもお気軽に再開してください
最も参考になるコメント
ええ、特に認可において。 現在取り組んでいるので、より多くの視点やアプローチを得るのは良いことです。
ここに売り込んでくれてありがとう。 他に問題が発生した場合は、お知らせください。 何か残っていない限り、これを閉じておきます