Realtime: JavaScript 示例对我不起作用

创建于 2020-05-29  ·  12评论  ·  资料来源: supabase/realtime

嘿,

只是想让您知道 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 :)

最有用的评论

是的,尤其是在授权方面。 我们现在正在研究它,因此获得更多观点/方法是件好事。

感谢您在这里投球。 如果您遇到任何其他问题,请告诉我们。 除非你还剩下任何东西,否则我会关闭它

所有12条评论

@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文件夹中。

这就说得通了。 在基于浏览器的原始示例中,它全部链接在一起,所以我尝试以这种方式复制它。 但是你第二次提交的变化实际上使它更清晰。

关于代理示例:我会看看我能做什么。 您可能对身份验证如何融入图片最感兴趣,对吗? 因为我提到的其他事情应该很简单。

是的,尤其是在授权方面。 我们现在正在研究它,因此获得更多观点/方法是件好事。

感谢您在这里投球。 如果您遇到任何其他问题,请告诉我们。 除非你还剩下任何东西,否则我会关闭它

现在关闭,随时可以重新开放

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

awalias picture awalias  ·  5评论

awalias picture awalias  ·  6评论

lacoprof picture lacoprof  ·  4评论

kiwicopple picture kiwicopple  ·  14评论

kiwicopple picture kiwicopple  ·  16评论