Partager via


Résoudre les problèmes courants Socket.IO

Web PubSub pour Socket.IO s’appuie sur la bibliothèque de Socket.IO. Lorsque vous utilisez le service Azure, les problèmes peuvent être liés au service ou à la bibliothèque.

Pour trouver l’origine des problèmes, vous pouvez isoler la bibliothèque de Socket.IO en supprimant temporairement Web PubSub pour Socket.IO de votre application. Si l’application fonctionne comme prévu après la suppression, la cause racine est probablement associée au service Azure.

Utilisez cet article pour trouver des solutions aux problèmes courants liés au service. En outre, vous pouvez activer la journalisation côté serveur pour examiner le comportement de votre application Socket.IO, si aucune des solutions répertoriées n’aide.

Si vous pensez que les problèmes sont liés à la bibliothèque Socket.IO, reportez-vous à la documentation de la bibliothèque Socket.IO.

Côté serveur

Importation incorrecte du package

Erreur possible

TypeError: (intermediate value).useAzureSocketIO is not a function

Origine

Si vous utilisez TypeScript dans votre projet, vous pouvez observer cette erreur. Cela est dû à une importation incorrecte du package.

// Bad example
import * as wpsExt from "@azure/web-pubsub-socket.io"

Si un package n’est pas utilisé ou référencé après l’importation, le comportement par défaut du compilateur TypeScript n’est pas d’émettre le package dans le fichier .js compilé.

Solution

Utilisez import "@azure/web-pubsub-socket.io" à la place. Cette instruction d’importation force le compilateur TypeScript à inclure un package dans le fichier .js compilé, même si le package n’est référencé n’importe où dans le code source. En savoir plus sur cette question fréquemment posée à partir de la communauté TypeScript.

// Good example. 
// It forces TypeScript to include the package in compiled .js file.
import "@azure/web-pubsub-socket.io"

Côté client

Option de chemin d’accès incorrect

Erreur possible

GET <web-pubsub-endpoint>/socket.io/?EIO=4&transport=polling&t=OcmE4Ni 404 Introuvable

Origine

Le client Socket.IO a été créé sans option de path correcte.

// Bad example
const socket = io(endpoint)

Solution

Ajoutez l’option de path correcte avec la valeur /clients/socketio/hubs/eio_hub.

// Good example
const socket = io(endpoint, {
    path: "/clients/socketio/hubs/eio_hub",
});

Incorrect Web PubSub pour Socket.IO point de terminaison

Erreur possible

GET <non-web-pubsub-endpoint>/socket.io/?EIO=4&transport=polling&t=OcmE4Ni 404 Introuvable

Origine

Le client Socket.IO a été créé sans un bon web PubSub pour Socket.IO point de terminaison. Par exemple :

// Bad example. 
// This example uses the original Socket.IO server endpoint. 
const endpoint = "socketio-server.com";
const socket = io(endpoint, {
    path: "/clients/socketio/hubs/<Your hub name>",
});

Lorsque vous utilisez Web PubSub pour Socket.IO, vos clients établissent des connexions avec un service Azure. Lorsque vous créez un client Socket.IO, vous devez utiliser le point de terminaison de votre web PubSub pour Socket.IO ressource.

Solution

Laissez Socket.IO client utiliser le point de terminaison de votre web PubSub pour Socket.IO ressource.

// Good example.
const webPubSubEndpoint = "<web-pubsub-endpoint>";
const socket = io(webPubSubEndpoint, {
    path: "/clients/socketio/hubs/<Your hub name>",
});

Installé plusieurs versions pour le même package

Erreur possible

Le serveur lève l’erreur :

  const io = await require('socket.io')(server).useAzureSocketIO(wpsOptions);        
                                                  ^
TypeError: require(...)(...).useAzureSocketIO is not a function

Origine

Un package socket.io ou engine.io est ajouté à package.json sous le champ dépendances par l’utilisateur, tandis que le package sdk @azure/web-pubsub-socket.io spécifie une autre version en interne. Par exemple :

"dependencies": {
    "@azure/web-pubsub-socket.io": "1.0.1-beta.6",
    "socket.io": "4.6.1"
},

Après yarn install, les deux versions différentes sont installées. Vous pouvez vérifier en exécutant npm list socket.io. Cette commande doit afficher deux versions de packages socket.io :

demo@0.0.0 G:\demo
├─┬ @azure/web-pubsub-socket.io@1.0.0-beta.6
│ └── socket.io@4.7.1
└── socket.io@4.6.1

Solution

La solution dépend de la nécessité ou non d’une version personnalisée de socket.io ou de package engine.io.

  • La version personnalisée du package socket.io/engine.io n’est pas nécessaire Simplement la suppression de socket.io/engine.io dans package.json dépendances fonctionne. Par exemple :
"dependencies": {
    "@azure/web-pubsub-socket.io": "1.0.1-beta.6",
},
  • La version personnalisée du package socket.io/engine.io est nécessaire Dans ce cas, package.json peut être :
"dependencies": {
    "@azure/web-pubsub-socket.io": "1.0.1-beta.6",
    "socket.io": "4.6.1"
},

Ensuite, vous devez exécuter yarn install --flat. Il installe toutes les dépendances, mais autorise une seule version pour chaque package. Lors de la première exécution, il vous invite à choisir une version unique pour chaque package qui dépend de plusieurs plages de versions. Pour notre cas, il peut vous inviter à choisir des versions de socket.io, engine.io, engine.io-parser et peut-être plus encore. Assurez-vous que leurs versions sont mises en correspondance les unes avec les autres en fonction de l’implémentation native de socket.io package et engine.io package.

Les versions finales sont ajoutées à votre « package.json » sous un champ de résolution.

"resolutions": {
  "package-a": "a.b.c",
  "package-b": "d.e.f",
  "package-c": "g.h.i"
}