Aller au contenu
Dimitri Robiere PerrietD. R. PerrietCaen, FR — --:--:--FR · EN

Suivi de position en temps réel par WebSocket et React

○ Archivé
Client
MyDigitalSchool
Rôle
Développeur full-stack
Durée
5 jours
Année
2024
Stack
Node.js · Express · WebSocket (ws) · MongoDB · React · Leaflet
Suivi de position en temps réel par WebSocket et React — illustration
Fig. 01 — Suivi de position en temps réel par WebSocket et React, illustration
(00) — En bref

Exercice temps réel en Node.js : une carte React où chaque utilisateur partage sa position et l’accélération de son téléphone, diffusées par WebSocket.

(01)

Contexte

Ce suivi de position par WebSocket a été réalisé en quelques jours pour un module consacré au temps réel. L’idée : afficher sur une carte tous les utilisateurs connectés, avec leurs coordonnées et les données d’accélération de leur appareil.

L’application se compose d’un serveur Node.js et d’un client React, déployés sur l’hébergement mis à disposition par l’école.

(02)

Challenge

Les API de géolocalisation et DeviceMotion du navigateur ne fonctionnent que sur une page servie en HTTPS, et la connexion WebSocket doit elle aussi passer en sécurisé. Une bonne partie du temps est passée à faire tourner le serveur avec ses certificats.

Il fallait aussi gérer l’identité des utilisateurs sans vrai système de comptes : chacun choisit un pseudo, qui doit rester unique pour que les marqueurs ne se mélangent pas.

(03)

Approche

J’ai écrit un serveur Express couplé à la bibliothèque ws, qui reçoit les positions et accélérations et les rediffuse à tous les clients. Les utilisateurs sont enregistrés dans MongoDB via un modèle Mongoose, avec une route d’API dédiée.

Côté client, React affiche la carte avec react-leaflet, un marqueur par utilisateur et la liste des personnes en ligne. Le serveur est configuré en HTTPS avec des certificats Let’s Encrypt, ce qui débloque l’accès aux capteurs du téléphone.

(04) — Résultats

Chiffres clés
5
jours de développement
2
données partagées : position et accélération
2
dépôts : serveur et client
22
commits
← Projet précédent33 · Gestion de bibliothèque avec Symfony 7 et Nuxt 3Projet suivant35Boutique en ligne headless avec Strapi et React