Realtime: Les exemples JavaScript ne fonctionnent pas pour moi

Créé le 29 mai 2020  ·  12Commentaires  ·  Source: supabase/realtime

Hey,

Je voulais juste vous faire savoir qu'il semble y avoir une erreur dans les exemples JS.
J'essaie de faire fonctionner cela sur un serveur node.js. (pas un expert JS)
Le bloc de code ci-dessous ne fonctionne pas pour moi.

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) })

ce qui fonctionne à la place est le suivant :

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) })

Merci pour la grande lib :)

Commentaire le plus utile

Ouais surtout dans l'autorisation. Nous y travaillons maintenant, il est donc bon d'avoir plus de perspectives/d'approches.

Merci d'être venu ici. Si vous êtes coincé avec autre chose, faites-le nous savoir. Je vais laisser ça fermer sauf s'il vous reste quelque chose

Tous les 12 commentaires

Salut @retendo ! Merci d'avoir persisté assez longtemps pour que cela fonctionne.

// related to node/browser difference?

Vous avez réussi. L'exemple en haut est pour le JS "navigateur" et celui en bas est pour le JS "serveur".

Bref historique (pas tout à fait exact) de JS : au départ, Javascript n'était vraiment utilisé que pour faire de petites choses dans le navigateur (petites animations). Ensuite, les gens ont commencé à créer des sites Web entiers avec.

Ensuite, google a pensé .. peut-être pouvons-nous également exécuter ce JS sur un serveur, pas seulement dans un navigateur ? Ils ont donc créé un "sous-ensemble" de Javascript - nodejs, et ils ont créé un "moteur" qui pourrait l'exécuter appelé v8 .

Mais NodeJS n'a pas vraiment le même "dialecte". (Recherchez CommonJS vs AMD vs UMD.) C'est pourquoi des outils comme babel existent. Ils « traduisent » JS entre les différents dialectes JS.

Quoi qu'il en soit, vous avez réussi avec le require('@supabase/realtime-js'); pour Node

Si vous avez un bon exemple simple qui fonctionne, peut-être pourriez-vous même l'ajouter en tant qu'exemple node-js dans le dossier /examples ? Nous sommes très ouverts aux contributeurs.

Je pense que le changement le plus important devrait être le ".channel" entre join() et on( ... ).
Cela ne semble pas lié aux différences node.js/browser.
Ou est-ce que cela fonctionne d'une manière ou d'une autre dans le navigateur ?
Il semble que .join() renvoie un objet Push au lieu d'un canal.

Je vais devoir vérifier ça. Avez-vous un dépôt existant que je peux forker ? Si c'est privé pas de problèmes, je vais créer une petite démo express dans ce repo

Vous avez un exemple de code ici :
https://gist.github.com/retendo/3e2ddb90a29dfd0f5a2ab81729c7ed29

Cela fonctionne avec l'exemple de code ajusté

en plus de cela, les chemins génériques fonctionnent sur le chemin du canal.
socket.channel('realtime:public:users') -> fonctionne
socket.channel(' ') -> cassésocket.channel('realtime: ') -> cassé
socket.channel('realtime:public:*') -> cassé

socket.channel('realtime:public') fonctionne cependant. Omettez simplement le dernier deux-points.

@retendo désolé pour l'incommunicado - je regarde ça et je construis un exemple de base de nodejs maintenant, mais je ne finirai probablement pas avant demain matin mon heure.

Pour info : ça ne devrait pas fonctionner

socket.channel('') -> broken
socket.channel('realtime:') -> broken
socket.channel('realtime:public:*') -> broken (see realtime:public below)

Mais ceux-ci devraient

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

Utilisez le « on » pour écouter différents « types d'événements ». En utilisant le code dans votre résumé :

// 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 => {});

J'espère que ça aidera un peu! Je n'ai pas encore testé ton code mais il a l'air super ! Je vois exactement où vous voulez en venir - créer un proxy (peut-être à des fins d'authentification ?)

Pour l'authentification, des API de socket spécialisées qui masquent la structure de la base de données sous-jacente et certaines modifications de la charge utile.

Petit exemple poussé pour vous @retendo. J'ai utilisé votre code comme référence donc merci pour votre contribution

pense que le changement le plus important devrait être le ".channel" entre join() et on( ... ).

Découvrez la différence entre mon premier commit et mon second : https://github.com/supabase/realtime/commit/d4c9eced516518f26d0174cc86508dc9530d0738

Fondamentalement, socket.channel() renvoie le canal et socket.channel.join() renvoie l'événement de jointure. Donc, vous "accédiez" à la chaîne via l'événement join .

Veuillez me tenir au courant de votre proxy - si vous pouvez le garder suffisamment générique, je l'ajouterai au dossier examples .

Ça a du sens. Dans l'exemple original basé sur le navigateur, tout était enchaîné, j'ai donc essayé de le reproduire de cette façon. Mais les changements dans votre deuxième commit le rendent en fait plus clair.

Concernant l'exemple de proxy : je vais voir ce que je peux faire. Vous êtes probablement plus intéressé par la façon dont l'authentification s'intègre dans l'image, n'est-ce pas ? Parce que les autres choses que j'ai mentionnées devraient être simples.

Ouais surtout dans l'autorisation. Nous y travaillons maintenant, il est donc bon d'avoir plus de perspectives/d'approches.

Merci d'être venu ici. Si vous êtes coincé avec autre chose, faites-le nous savoir. Je vais laisser ça fermer sauf s'il vous reste quelque chose

Fermeture maintenant, n'hésitez pas à rouvrir à tout moment

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

awalias picture awalias  ·  9Commentaires

kiwicopple picture kiwicopple  ·  14Commentaires

awalias picture awalias  ·  6Commentaires

awalias picture awalias  ·  5Commentaires

kiwicopple picture kiwicopple  ·  16Commentaires