web-dev-qa-db-fra.com

socket.io - ReferenceError: io n'est pas défini

J'écris une application pour Android 2.3.5 (qui sera également compatible avec iOS). Je souhaite transférer des données du code HTML/Javascript de l'application vers un programme Python sur un serveur (qui utilise le moteur Twisted pour récupérer les données).

J'ai essayé beaucoup de choses et j'ai consulté divers forums, réponses, tutoriels et pages Web - y compris la plupart d'entre eux ici - et je ne trouve pas de réponse. Voici le code Javascript que j'ai dans mon fichier index.html:

<script src="socket-lib/socket.io.js"></script>
<script type="text/javascript" charset="utf-8">
function sendData() {
    try {
        var socket = io.connect('http://mywebsite.com:12345');
        socket.on('connect', function(data) {
            socket.send('Hello.');
            socket.on('message', function (msg) {
                socket.send('This is where I send data?');
            });
        });
    }
    catch(err) {
        alert('ERROR: socket.io encountered a problem:\n\n' + err);
    }
} // end of sendData

Si vous ne pouvez pas le dire, je ne comprends toujours pas comment cela fonctionne. Je ne peux même pas tester quoi que ce soit. L'erreur qui continue à arriver est ReferenceError: io is not defined. Certains sites utilisaient quelque chose comme var io = require('socket.io');. Mais alors il en résulte la même erreur: ReferenceError: require is not defined.

Je mets le dossier socket-lib dans assets/www, où toute autre source Javascript devrait aller. C'est également là que se trouve le fichier index.html. De nombreux sites utilisent <script src="/socket.io/socket.io.js"></script>, mais cela n’a aucun sens pour moi. De nombreux sites impliquent également l'utilisation de node.js, mais je ne le vois jamais nulle part.

Comment puis-je faire ce travail?

Réponse édite:

Je l'ai essayé dans Chrome, et il me donne un Uncaught ReferenceError: require is not defined pour le fichier socket.io.js. Je décide donc de chercher dans require.js juste avant. Ensuite, il donne l'erreur Uncaught Error: Module name "socket.io-client" has not been loaded yet for context. Depuis que je ne l'utilise pas, je m'en fiche. Lorsque j'essaie de me connecter, cela donne la même erreur io is not defined. Lorsque je le définit comme var io = require('socket.io'), l'erreur est Error: Module name "socket.io" has not been loaded yet for context: _ http://requirejs.org/docs/errors.html#notloaded. J'ai regardé le site Web et cela ne m'aide pas du tout. Lorsque j'essaie de mettre "require" comme argument de fonction, une autre erreur se produit: TypeError: undefined is not a function.

29
Ness

J'ai trouvé la réponse à tous ceux qui se retrouvent immensément déroutés par l'horrible manque de documentation de socket.io.

Vous ne pouvez pas source /socket-lib/socket.io.js,

vous devez source http://yourwebsite.com:12345/socket.io/socket.io.js.

Le serveur fait automatiquement le reste pour vous.

51
Ness

Je l'ai résolu moi-même en modifiant index.html pour importer le client socket io de Bower. J'ai d'abord installé le composant Bower:

 bower install socket.io-client

alors j'ai changé la référence dans index.html à:

 <script src="bower_components/socket.io-client/socket.io.js"></script>

Ou le fichier peut être trouvé à - lib/socket.io-client/dist/socket.io.js 

6
shacharsol

Lorsque socket.io fonctionnait avec de nombreuses autres bibliothèques utilisant require.js j’avais la même erreur, il s’est avéré dû au chargement du fichier socket.io.js du même dossier/js que reste des autres fichiers.

En le plaçant dans un dossier séparé, corrigé pour moi, vous pouvez voir le code dans ce Gist mais tout ce que j'ai changé pour que cela fonctionne est le suivant:

au lieu de:

socketio: 'socket.io',

Utilisation: 

socketio: '../socket.io/socket.io',

Pas sûr de la raison de ce comportement, mais j'espère que cela vous aidera.

1
guerrerocarlos

écrivez le code côté serveur dans le fichier socket.io.js et essayez src = "/ socket.io/socket.io.js"

espérons que cela résoudra votre problème

1
Sudhakar P

Cela ressemble à votre navigateur ne peut pas trouver le fichier socket.io.js. Vous pouvez essayer d’ouvrir le fichier index.html sur votre ordinateur à l’aide de Firefox + Firebug ou des outils de développement Web de Chrome et voir comment le fichier .js est demandé. De l’autre côté, vous pouvez vérifier dans les journaux du serveur Web desservant le fichier .js s’il existe des erreurs de fichier non trouvé.

La fonction require serait fournie par ex. RequireJS , mais vous devez tout de même configurer correctement les chemins d'accès à vos scripts pour que cela fonctionne.

0
Stefan Seemayer

Pour moi, après avoir débogué à travers toutes les suggestions très utiles, il s’est avéré simplement que mon serveur de nœuds s’était arrêté. Je l'avais exécuté manuellement dans une fenêtre de terminal pendant le développement.

Assurez-vous que votre noeud [yourservercode] .js est en cours d'exécution sur le port spécifié! : -]

0
Tim T

J'ai réussi à gâcher cela et j'ai gaspillé environ une heure sur quelque chose qui s'est avéré être une erreur très fondamentale.

Quand une fonction n'est pas définie? Tels que "Uncaught ReferenceError: io n'est pas défini". Cela ne signifie-t-il pas que la fonction est "utilisée" avant d'être "créée"?

Dans la partie de mon fichier HTML, qui "appelle" les fichiers javaScript, ilavait l'airressemblait à ceci:

<script src='./js/playerChatter.js'></script> <!-- this one calls io -->
<script src="http://localhost:2019/socket.io/socket.io.js"></script><!-- This Creates io -->

et jechangéil à ceci

<script src="http://localhost:2019/socket.io/socket.io.js"></script> <!-- This Creates  io -->
<script src='./js/playerChatter.js'></script> <!-- this on calls io -->

Alors maintenant, l'item "io", que ce soit un objet ou une fonction ... est en train d'être créé avant d'être utilisé: D

S'amuser!

0
Mat-e

J'utilise jspm.

Ajoute ça:

import 'btford/angular-socket-io/mock/socket-io';
0
Vitaliy Demchuk