Realtime: Примеры JavaScript не работают для меня

Созданный на 29 мая 2020  ·  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) })

Спасибо за отличную библиотеку :)

Самый полезный комментарий

Ага особенно в авторизации. Сейчас мы работаем над этим, так что хорошо, если есть больше точек зрения / подходов.

Спасибо, что пришли сюда. Если вы застряли в чем-то еще, просто дайте нам знать. Я оставлю это закрытым, если у тебя ничего не останется

Все 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 папку? Мы очень открыты для участников.

Я думаю, что более важным изменением должен быть ".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 .

В этом есть смысл. В исходном примере на основе браузера все было связано вместе, поэтому я попытался воспроизвести это таким образом. Но изменения во втором коммите на самом деле проясняют его.

Что касается примера прокси: я посмотрю, что я могу сделать. Вас, наверное, больше всего интересует, как аутентификация вписывается в общую картину, верно? Потому что остальные вещи, о которых я упомянул, должны быть простыми.

Ага особенно в авторизации. Сейчас мы работаем над этим, так что хорошо, если есть больше точек зрения / подходов.

Спасибо, что пришли сюда. Если вы застряли в чем-то еще, просто дайте нам знать. Я оставлю это закрытым, если у тебя ничего не останется

Закрытие сейчас, не стесняйтесь открывать снова на любом этапе

Была ли эта страница полезной?
0 / 5 - 0 рейтинги