Je recherche à faire une application avec socket io sauf que j'ai une erreur récurrente.
j'ai ceci sur firefox :
Blocage d’une requête multiorigines (Cross-Origin Request) : la politique « Same Origin » ne permet pas de consulter la ressource distante située sur http://file/socket.io/?EIO=4&transport=polling&t=NeK0LQY. Raison : échec de la requête CORS.
ceci sur chrome :
Failed to load resource: net::ERR_NAME_NOT_RESOLVED
polling-xhr.js:198 GET http://file/socket.io/?EIO=4&transport=polling&t=NeK1gid net::ERR_NAME_NOT_RESOLVED
Ce que je constate c'est que la liaison avec le serveur se fais bien, mais ce que je ne comprend pas c'est d'où viens l'erreur 404 et pourquoi je n'ai pas de message client connected..
Bonjour il y à un problème avec le code côté serveur si tu nous à posté le code complet il manque l'implémentation du socket.io côté serveur tu ne l'as fait que côté client, c'est surement pour ça que tu as une erreur 404 lors de la requête ouverte par javascript vers:
Parce que /socket.io/ est une route qui n'existe pas sur ton application serveur c'est en implémentant le code côté serveur de socket.io que la route sera construite par la librairie.
Tu peut trouvé un code d'exemple minimal (mais fonctionnel et commenté avec la partie client et serveur implémenté) sur github, ce projet d'exemple sur github à été publié par les mainteneurs de socket.io tu peut le retrouvé dans la partie démo de la documentation
Les lien ci-dessus doivent être suffisant pour monté un code minimal (et plus poussé) côté serveur, mais pour te donné une illustration de à quoi devrait ressemblé ton fichier serveur.js:
const express = require("express");
const app = express();
const mysql = require("mysql");
const http = require('http');
const server = http.createServer(app);
// importe le package
const socketIO = require('socket.io');
// construit le service (en passant le serveur en paramètre pour qu'il puisse ajouté des routes dessue)
const io = socketIO(server);
// écoute la connection d'un nouveau client:
// lors q'une requête type: <http://localhost:3000/socket.io/?EIO=4&transport=polling&t=NePFdFM>
// aboutira la connection du client sera écouté ici
io.on('connection', socket => {
console.log("un nouveau client c'est connecté");
// envoi une requête à tous les autres client connecté
// côté client la requête et écoutable via:
// socket.on('new client', function() ...);
socket.broadcast.emit('new client');
});
app.use((req, res, next) => {
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content, Accept, Content-Type, Authorization');
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, PATCH, OPTIONS');
next();
});
app.use('/api/afficheur', (req, res, next) => {
const afficheur = [
{
_id: 'oeihfzeoi',
title: 'Mon premier objet',
description: 'Les infos de mon premier objet',
imageUrl: 'https://cdn.pixabay.com/photo/2019/06/11/18/56/camera-4267692_1280.jpg',
price: 4900,
userId: 'qsomihvqios',
},
{
_id: 'oeihfzeomoihi',
title: 'Mon deuxième objet',
description: 'Les infos de mon deuxième objet',
imageUrl: 'https://cdn.pixabay.com/photo/2019/06/11/18/56/camera-4267692_1280.jpg',
price: 2900,
userId: 'qsomihvqios',
},
];
res.status(200).json(afficheur);
});
server.on('connection', (socket) => {
console.log('OK');
});
server.listen(3000, () => {
console.log('listening on *:3000');
});
Elle m'a permis de comprendre et de résoudre l'erreur.
À présent, je suis sur une nouvelle erreur que j'ai déjà eu sur ce projet.
Voici l'erreur :
Blocage d’une requête multiorigines (Cross-Origin Request) : la politique « Same Origin » ne permet pas de consulter la ressource distante située sur http://127.0.0.1:3000/socket.io/?EIO=4&transport=polling&t=NeUGcwQ. Raison : l’en-tête CORS « Access-Control-Allow-Origin » est manquant.
Bonjour mettre le CORS sur '*' et le plus permissif puisque il accepte les requêtes venant de n'importe quelle origine (pour le dev en local c'est suffisant)
Te retourne que socketIO n'est pas une fonction parce que tu l'as exécuté immédiatement à l'appel la fonction retourné par le package si tu veut le faire en 2 fois pour avoir le résultat dans io comme dans le code précédent tu peut l'écrire comme cela:
Blocage d’une requête multiorigines (Cross-Origin Request) : la politique « Same Origin » ne permet pas de consulter la ressource distante située sur http://127.0.0.1:3000/socket.io/?EIO=4&transport=polling&t=NeUGcwQ
Et très certainement parce que ton application client tourne sur un port de communication différent de l'application serveur (qui et actuellement sur le port 3000) les port de communication font partie du nom de l'hôte quand le serveur reçoit un requête de: http://localhost:80 (en admettant que l'application client et sur le port 80) il considère que c'est un hôte différent de http://localhost:3000
C'est pour cela que mettre le CORS sur '*' via
Access-Control-Allow-Origin: *
dans les en tête de réponse du serveur, règle le problème en acceptant les requêtes depuis toutes les origines.
// construit le service (en passant le serveur en paramètre pour qu'il puisse ajouté des routes dessue)
const io = socketIO(server, {
allowEIO3: true, // false by default
cors : {
origin: function (origin, callback) {
callback(null, true)
},
credentials: true,
}
});
suggestion de présentation.
suggestion de présentation.
suggestion de présentation.