wake-up-neo.net

socket.io - ReferenceError: io ist nicht definiert

Ich schreibe eine Anwendung für Android 2.3.5 (die auch mit iOS kompatibel sein wird). Ich möchte Daten aus dem HTML/Javascript der App an ein Python-Programm auf einem Server übertragen (der die Twisted-Engine zum Abrufen der Daten verwendet).

Ich habe viele Dinge ausprobiert und mir verschiedene Foren, Antworten, Tutorials und Webseiten angesehen - darunter auch die meisten - und ich habe keine Antwort gefunden. Hier ist das relevante Javascript, das ich in meiner index.html Datei habe:

<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

Wenn Sie es nicht sagen können, bin ich immer noch ziemlich verwirrt, wie das funktioniert. Ich kann gar nichts testen. Der Fehler, der ständig angezeigt wird, ist ReferenceError: io is not defined. Einige Sites verwendeten etwas wie var io = require('socket.io');. Dann ergibt sich jedoch der gleiche Fehler: ReferenceError: require is not defined.

Ich habe den Socket-lib-Ordner in assets/www eingefügt, wohin andere Javascript-Quellen gehen sollen. Hier befindet sich auch die Datei index.html. Viele Websites verwenden <script src="/socket.io/socket.io.js"></script>, aber das macht für mich keinen Sinn. Viele Websites implizieren auch die Verwendung von node.js, aber ich sehe es nirgendwo.

Wie kann ich diese Arbeit machen?

Antworten bearbeiten:

Ich habe es in Chrome ausprobiert und es gibt mir einen Uncaught ReferenceError: require is not defined für die Datei socket.io.js. Also entscheide ich mich für die Quelle in requir.js direkt davor. Dann gibt es den Fehler Uncaught Error: Module name "socket.io-client" has not been loaded yet for context. Da ich das nicht benutze, kümmere ich mich nicht darum. Wenn ich die Verbindung versuche, gibt es jedoch den gleichen io is not defined-Fehler. Wenn ich es als var io = require('socket.io') definiere, lautet der Fehler Error: Module name "socket.io" has not been loaded yet for context: _ http://requirejs.org/docs/errors.html#notloaded. Ich habe mir die Website angesehen und sie hilft mir überhaupt nicht. Wenn ich versuche, "required" als Funktionsargument zu verwenden, tritt ein anderer Fehler auf: TypeError: undefined is not a function.

29
Ness

Ich fand die Antwort für jeden, der durch den schrecklichen Mangel an Dokumentation von socket.io immens verwirrt wird.

Sie können /socket-lib/socket.io.js nicht als Quelle verwenden.

sie müssen http://yourwebsite.com:12345/socket.io/socket.io.js angeben.

Der Server erledigt den Rest automatisch für Sie.

51
Ness

Ich habe es selbst gelöst, indem ich index.html geändert habe, um den Socket-io-Client von Bower zu importieren. Zuerst habe ich die Bower-Komponente installiert:

 bower install socket.io-client

dann änderte ich den Verweis in index.html in:

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

Oder die Datei könnte unter - lib/socket.io-client/dist/socket.io.js gefunden werden 

6
shacharsol

Bei der Verwendung von socket.io mit vielen anderen Bibliotheken mit requir.js hatte ich den gleichen Fehler. Es stellte sich heraus, dass es die Ursache war, dass versucht wurde, die Datei socket.io.js aus dem gleichen/js-Ordner zu laden Rest der anderen Dateien.

Wenn Sie es in einem separaten Ordner ablegen, können Sie den - Code in diesem Gist sehen, aber alles, was ich geändert habe, um es zum Laufen zu bringen, war folgendes:

anstatt:

socketio: 'socket.io',

Benutzen: 

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

Nicht sicher über den Grund dieses Verhaltens, aber ich hoffe, es hilft Ihnen.

1
guerrerocarlos

schreibe serverseitigen Code in die Datei socket.io.js und versuche src = "/ socket.io/socket.io.js"

ich hoffe, das löst dein Problem

1
Sudhakar P

Anscheinend kann Ihr Browser die Datei socket.io.js nicht finden. Sie können versuchen, die index.html auf Ihrem Computer mit Firefox + Firebug oder den Chrome Web Developer Tools zu öffnen und zu überprüfen, wie die JS-Datei angefordert wird. Auf der anderen Seite könnten Sie die Protokolle auf dem Webserver überprüfen, der die .js-Datei bereitstellt, ob es Fehler gibt, die nicht gefunden wurden.

Die require-Funktion würde z.B. RequireJS , Sie müssen jedoch die Pfade zu Ihren Skripts ordnungsgemäß konfigurieren, damit sie funktionieren.

0
Stefan Seemayer

Nach dem Debuggen durch alle sehr hilfreichen Vorschläge stellte sich heraus, dass mein Knotenserver einfach angehalten hatte. Ich hatte es während dev manuell in einem Terminalfenster ausgeführt.

Stellen Sie sicher, dass Ihr Knoten [IhrServercode] .js am angegebenen Port ausgeführt wird! : -]

0
Tim T

Ich schaffte es durchzugehen und verschwendete etwa eine Stunde lang etwas, was sich als sehr grundlegender Fehler herausstellte.

Wenn eine Funktion nicht definiert ist? Zum Beispiel "Nicht abgerufener ReferenceError: io ist nicht definiert". Bedeutet das nicht, dass die Funktion "verwendet" wird, bevor sie "erstellt" wird?

In dem Teil meiner HTML-Datei, der die JavaScript-Dateien "aufruft", sah esfolgendermaßen aus:

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

und ichändertees dazu

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

Nun wird also das Element "io", ob es sich um ein Objekt oder eine Funktion handelt, tatsächlich erstellt, bevor es sich gewöhnt: D

Habe Spaß!

0
Mat-e

Ich benutze Jspm.

Füge das hinzu:

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