2012-08-16 16 views
26

Piszę aplikację dla systemu Android 2.3.5 (która będzie również kompatybilna z iOS). Chciałbym przenieść dane z kodu HTML/JavaScript aplikacji do programu Python na serwerze (który używa mechanizmu Twisted do pobierania danych).socket.io - ReferenceError: io nie jest zdefiniowany

Próbowałem wielu rzeczy i patrzyłem na różne fora, odpowiedzi, tutoriale i strony internetowe - w tym większość z nich tutaj - i nie mogę znaleźć odpowiedzi. Oto odnośny JavaScript mam w pliku 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 

Jeśli nie można powiedzieć, że jestem jeszcze całkiem zdezorientowany, jak to działa; Nie mogę nawet niczego przetestować. Błąd, który ciągle nadchodzi, to ReferenceError: io is not defined. Niektóre witryny używały czegoś takiego jak var io = require('socket.io');. Ale wtedy powoduje to ten sam błąd: ReferenceError: require is not defined.

Umieszczam folder socket-lib w zasobach/www, gdzie powinno być inne źródło JavaScript. Tutaj także znajduje się plik index.html. Wiele witryn używa <script src="/socket.io/socket.io.js"></script>, ale to nie ma dla mnie żadnego sensu. Wiele witryn oznacza również użycie pliku node.js, ale nigdy go nie widzę.

Jak mogę to ułatwić?

Odpowiedz redaguje:

próbowałem go w Chrome, a to daje mi Uncaught ReferenceError: require is not defined dla pliku socket.io.js. Dlatego zdecydowałem się na źródło w require.js tuż przed nim. Następnie daje błąd Uncaught Error: Module name "socket.io-client" has not been loaded yet for context. Ponieważ nie używam tego, nie obchodzi mnie to. Kiedy próbuję połączenia, daje to ten sam błąd io is not defined. Kiedy zdefiniuję go jako var io = require('socket.io'), błąd to Error: Module name "socket.io" has not been loaded yet for context: _ http://requirejs.org/docs/errors.html#notloaded. Spojrzałem na stronę internetową i wcale mi to nie pomaga. Kiedy próbuję umieścić "require" jako argument funkcji, pojawia się kolejny błąd: TypeError: undefined is not a function.

+3

Znalazłem odpowiedź, dla każdego, kto dostaje ogromnie mylone przez strasznym brakiem dokumentacji socket.io. Nie można uzyskać źródła "/socket-lib/socket.io.js"; musisz pobrać "http://yourwebsite.com:12345/socket.io/socket.io.js". Serwer automagicznie wykonuje resztę za Ciebie. – Ness

+0

jesteś moją nową ulubioną osobą, proszę pana! Ich próbki na socket.io są okropnie mylące. – Xealgo

+0

Zgodnie z dokumentacją, ponieważ v1.0 można zażądać biblioteki klienta z ich CDN: http: // socket.io/blog/introducing-socket-io-1-0/# cdn-delivery – maxwell2022

Odpowiedz

49

Znalazłem odpowiedź dla każdego, kto jest niezmiernie zdezorientowany przez okropny brak dokumentacji socket.io.

Nie można zaopatrywać /socket-lib/socket.io.js,

trzeba zaopatrywać http://yourwebsite.com:12345/socket.io/socket.io.js.

Serwer automatycznie wykona resztę za Ciebie.

+1

I tutaj wymieniony port (12345) to nic innego jak port, na którym działa węzeł z gniazdem.io – siddhusingh

+0

Zapomniałem utworzyć 'VirtualHost' w'/etc/apache2/httpd.conf', aby wskazać port, w którym znajduje się mój węzeł serwer działał, w moim przypadku był to ' ...' – mlunoe

+0

Otrzymałem ten błąd z powodu następującej linii: wyglądało jak bzdury, bo kiedy używam w świeżym pliku html - działało, ale potem próbowałem przez części - użyj php die() i zacznij od początku plik - działał, dopóki mój skrypt gniazd nie został uruchomiony po bibliotece require.js. Eearlier nie wyrządził żadnej krzywdy, ale być może, gdy węzeł udpated coś - to się zepsuło. –

0

Wygląda na to, że przeglądarka nie może znaleźć pliku socket.io.js. Możesz spróbować otworzyć plik index.html na swoim komputerze za pomocą przeglądarki Firefox + Firebug lub Narzędzi dla programistów Chrome Web i sprawdzić, w jaki sposób żądany jest plik .js. Z drugiej strony można sprawdzić dzienniki na serwerze internetowym obsługującym plik .js, czy występują błędy pliku.

Funkcja require byłaby zapewniona przez np. RequireJS, ale trzeba by poprawnie skonfigurować ścieżki do skryptów, aby działały.

+0

Czy masz jeszcze jakieś porady? Nadal nie mogę tego zmusić do działania. – Ness

+0

Bez zauważenia zarówno kodu, jak i struktury katalogów, trudno jest stwierdzić, co jest nie tak. Może gdzieś możesz przesłać swoje dotychczasowe postępy? –

+0

Cały odpowiedni kod został już opublikowany. Problem występuje nadal, gdy wszystkie inne Javascript są usuwane. Jeśli chodzi o strukturę katalogów, jest ona w Eclipse SDK, a projekt to HelloWorld. Plik "index.html" i folder "socket-lib" znajdują się w "HelloWorld/assets/www". Jedynym innym ważnym plikiem (jak sądzę) byłby plik Java: "HelloWorld/src/com.helloworld.helloworld/Hello.java". Został stworzony domyślnie; jedyną rzeczą, którą tam zrobiłem, była zmiana linii 'setContentView()' na 'super.loadUrl (" file: ///android_asset/www/index.html ");'. – Ness

0

Podczas pobierania pliku socket.io w celu pracy z wieloma innymi bibliotekami przy użyciu require.js wystąpił ten sam błąd, który okazał się być spowodowany próbą załadowania pliku socket.io.js z tego samego katalogu/js niż reszta pozostałe pliki.

umieszczenie go w oddzielnym folderze, stałe to dla mnie, można zobaczyć code in this gist ale zmieniłem na co działa, było to:

zamiast:

socketio: 'socket.io',

Wykorzystanie :

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

Nie jestem pewien co do przyczyny tego zachowania, ale mam nadzieję, że ci to pomoże.

+0

Ze względu na strukturę folderów zainstalowanego pakietu socket.io. Musi wskazywać folder główny serwera, a następnie ścieżkę socket.io – kabuto178

0

Udało mi się to przezwyciężyć i zmarnowałem około godziny, na czymś, co okazało się bardzo podstawowym błędem.

Kiedy funkcja nie jest zdefiniowana? Takich jak "Uncaught ReferenceError: io nie jest zdefiniowane". Czy to nie oznacza, że ​​funkcja jest "używana", zanim zostanie "stworzona"?

W części mojego pliku HTML, który "nazywa" pliki JavaScript, to wyglądał takiego:

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

a ja zmienił to do tego

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

Teraz element "io", niezależnie od tego, czy jest to obiekt czy funkcja ... Czy w rzeczywistości powstaje befo? ponownie się przyzwyczaja: D

Życzymy miłej zabawy!

0

Po debugowaniu wszystkich bardzo pomocnych wskazówek okazało się, że mój serwer węzłowy został zatrzymany. Byłem uruchomiony ręcznie w oknie terminala podczas dev.

Upewnij się, że Twój węzeł [twójservercode] .js działa na określonym porcie! : -]

5

I rozwiązać go samodzielnie poprzez zmianę index.html importować gniazdo io klienta z altany, najpierw zainstalować komponent altana:

bower install socket.io-client 

potem zmieniłem odniesienie w index.html do:

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

lub plik można znaleźć w - lib/socket.io-client/dist/socket.io.js

0

używam jspm.

Dodaj to:

import 'btford/angular-socket-io/mock/socket-io'; 
Powiązane problemy