Привет,
просто хотел сообщить вам, что, похоже, в примерах 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) })
Спасибо за отличную библиотеку :)
Привет, @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
папку? Мы очень открыты для участников.
Я думаю, что более важным изменением должен быть ".channel" между join () и on (...).
Кажется, это не связано с различиями между node.js и браузером.
Или это как-то работает в браузере?
Кажется, что .join () возвращает объект Push вместо Channel.
Я должен это проверить. У вас есть репо, которое я могу разветвить? Если это частный случай, я создам небольшую экспресс-демонстрацию в этом репо.
Вот пример кода:
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. Я использовал ваш код в качестве основы, поэтому спасибо за участие
думаю, что более важным изменением должен быть ".channel" между join () и on (...).
Посмотрите, чем отличается моя первая фиксация от второй: https://github.com/supabase/realtime/commit/d4c9eced516518f26d0174cc86508dc9530d0738
Обычно socket.channel()
возвращает канал, а socket.channel.join()
возвращает событие соединения. Итак, вы «получали доступ» к каналу через событие join
.
Пожалуйста, держите меня в курсе вашего прокси - если вы можете сделать его достаточно общим, я добавлю его в папку examples
.
В этом есть смысл. В исходном примере на основе браузера все было связано вместе, поэтому я попытался воспроизвести это таким образом. Но изменения во втором коммите на самом деле проясняют его.
Что касается примера прокси: я посмотрю, что я могу сделать. Вас, наверное, больше всего интересует, как аутентификация вписывается в общую картину, верно? Потому что остальные вещи, о которых я упомянул, должны быть простыми.
Ага особенно в авторизации. Сейчас мы работаем над этим, так что хорошо, если есть больше точек зрения / подходов.
Спасибо, что пришли сюда. Если вы застряли в чем-то еще, просто дайте нам знать. Я оставлю это закрытым, если у тебя ничего не останется
Закрытие сейчас, не стесняйтесь открывать снова на любом этапе
Самый полезный комментарий
Ага особенно в авторизации. Сейчас мы работаем над этим, так что хорошо, если есть больше точек зрения / подходов.
Спасибо, что пришли сюда. Если вы застряли в чем-то еще, просто дайте нам знать. Я оставлю это закрытым, если у тебя ничего не останется