嘿,
只是想让您知道 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 与 AMD 与 UMD。)这就是像 babel 这样的工具存在的原因。 他们在不同的 JS 方言之间“翻译”JS。
无论如何 - 你用require('@supabase/realtime-js');
为 Node 钉上了它
如果您有一个很好的简单示例工作,也许您甚至可以将它作为node-js
示例添加到/examples
文件夹中? 我们对贡献者非常开放。
我认为更重要的变化应该是 join() 和 on( ... ) 之间的“.channel”。
这似乎与 node.js/browser 差异无关。
或者这是在浏览器中以某种方式工作?
似乎 .join() 返回一个 Push 对象而不是一个 Channel 。
我得检查一下。 你有我可以分叉的现有仓库吗? 如果它是私有的,没有问题,我将在这个 repo 中创建一个小的 express 演示
在这里有一些示例代码:
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
使用“on”来收听不同的“事件类型”。 使用您的要点中的代码:
// 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”。
查看我的第一次提交和第二次提交之间的区别: https :
基本上socket.channel()
返回频道,而socket.channel.join()
返回加入事件。 所以你是通过join
事件“访问”频道的。
请让我更新您的代理 - 如果您可以保持足够的通用性,我会将其添加到examples
文件夹中。
这就说得通了。 在基于浏览器的原始示例中,它全部链接在一起,所以我尝试以这种方式复制它。 但是你第二次提交的变化实际上使它更清晰。
关于代理示例:我会看看我能做什么。 您可能对身份验证如何融入图片最感兴趣,对吗? 因为我提到的其他事情应该很简单。
是的,尤其是在授权方面。 我们现在正在研究它,因此获得更多观点/方法是件好事。
感谢您在这里投球。 如果您遇到任何其他问题,请告诉我们。 除非你还剩下任何东西,否则我会关闭它
现在关闭,随时可以重新开放
最有用的评论
是的,尤其是在授权方面。 我们现在正在研究它,因此获得更多观点/方法是件好事。
感谢您在这里投球。 如果您遇到任何其他问题,请告诉我们。 除非你还剩下任何东西,否则我会关闭它