Implémentation de la communication en temps réel avec Express et SocketIO
Créons une application de messagerie, en utilisant SocketIO + Express pour le backend et n'importe quel frontend.
Une introduction au CTR
La communication en temps réel, ou CTR en abrégé, décrit les communications en
direct avec peu ou pas de latence. Elle est utilisée dans les systèmes de
messagerie, l'envoi de notifications et bien plus encore. Aujourd'hui, nous
allons explorer comment configurer notre propre serveur Express pour créer une
application de messagerie simple entre deux utilisateurs différents.
Mise en place du frontend
Puisque cet article se concentre sur le backend, je n'entrerai pas dans les
détails sur la mise en place du frontend ou comment le structurer. J'utiliserai
SvelteKit mais l'implémentation ne différera guère pour les intégrations avec
d'autres frameworks tels que NextJS ou NuxtJS, ou même en vanilla JS.
Création de l'application Express
D'abord, initialisons le fichier package.json.
Terminal
Ensuite, modifions/ajoutons ce qui suit dans le fichier package.json.
package.json
Puis, installons les dépendances nécessaires pour notre serveur.
Terminal
Cela installera les modules cors pour gérer les requêtes émanant d'une
origine autre que celle du serveur, dotenv pour charger les variables
d'environnement dans notre serveur, express pour l'application elle-même et
socket.io pour permettre la communication en temps réel.
Nous ajoutons également les types nécessaires pour notre application.
Créons un fichier tsconfig.json manuellement ou avec npx tsc --init et
modifions son contenu avec ce qui suit. N'hésite pas à ajuster quoi que ce
soit.
tsconfig.json
Maintenant, ajoutons une fichier ts-loader.js à la racine de l'application
express. Cela nous permettra de ne pas recontrer de problèmes avec esm et ts.
ts-loader.js
Ajoute un fichier .env et remplis-le avec les ports que t'utiliseras.
.env
Ensuite, définissons notre fichier principal src/app.ts.
app.ts
Enfin, démarre l'application et accéde à l'URL du serveur. Tu seras accueilli
par Express.
Terminal
Implémentation de SocketIO
Maintenant, ajoutons SocketIO dans notre serveur et dans notre frontend.
Dans Express
Adaptons notre application Express avec ce qui suit.
app.ts
Dans le script ci-dessus, nous ajoutons un serveur HTTP, sur lequel nous
écouterons à la place de l'application Express et SocketIO pour écouter les
connexions et déconnexions.
Dans notre frontend
Commençons par installer le module client pour socket.io.
Terminal
Ensuite, créons un fichier socket.ts à partir duquel nous importerons notre
socket.
socket.ts
Maintenant, importons la fonction initSocket dans la page et appelons-la
après que l'application soit montée sur le navigateur. Adapte-le à ton
frontend.
+page.svelte
Tu devrais maintenant voir les logs dans l'application Express lorsque tu
recharges la page.
Envoi de messages
Enfin, nous travaillerons sur l'envoi d'un message d'un client et sa
transmission vers d'autres utilisateurs connectés, un peu comme une discussion
de groupe (PS : si tu souhaites l'envoyer à un client spécifique, tu devras
stocker un dictionnaire des userIds/sessionIds, et diffusez le message avec la
méthode to, mais je n'entrerai pas dans les détails car cet article est
plutôt une introduction aux websockets).
Dans notre serveur
À l'intérieur de la fonction io.connection et après l'appel
socket.on("disconnect"), nous ahjouterons un événement pour recevoir un
message et le diffuser à tout le monde, y compris nous-mêmes. Habituellement,
tu connecteras une base de données pour stocker les messages puisqu’ils
disparaîtront après un rechargement de page.
app.ts
Dans notre frontend
Mettons à jour notre page pour envoyer des messages, les recevoir et les
afficher.
+page.svelte
Tu peux le tester en ouvrant deux onglets/navigateurs distincts et en envoyant
un message. L'autre sera également mis à jour !
Conclusion
Nous avons désormais notre propre serveur websocket opérationnel et prêt à
construire le prochain réseau social ! Je plaisante.. De toute façon, on peut
faire beaucoup de choses avec SocketIO. Consulte leur
documentation officielle pour savoir plus.