tutorial socket rooms example html5 node.js socket.io

html5 - rooms - Socket.IO-require no está definido



socket.io chat rooms example (8)

¿Está ejecutando node.js a lo largo de PHP en su servidor?

Hay dos paquetes "socket.io", un servidor y un cliente . Está intentando cargar el servidor uno ( /node_modules/socket.io/lib/socket.io.js ) en el navegador. El script que desea se llama socket.io-client y puede encontrarlo en https://raw.github.com/LearnBoost/socket.io-client/master/socket.io-client.js

Lo que sucede es que socket.io sirve automáticamente el /socket.io/socket.io.js (el del cliente) desde el puerto 80 cuando está ejecutando el nodo en el puerto 80 . En su caso, Apache ya se encuentra en el puerto 80, por lo que debe servir el archivo manualmente.

Estoy intentando que socket.io funcione, pero ahora en Chrome me aparece el error:

Error de referencia no detectado: no está definido

client.php: 9Uncaught ReferenceError: io no está definido

Cambié la forma de incluir el archivo socket.io.js porque no existe en ninguna otra parte:

<script src="/node_modules/socket.io/lib/socket.io.js"></script>

Si lo intento

<script src="/socket.io/socket.io.js"></script>

Recibo: No se pudo cargar el recurso: el servidor respondió con un estado de 404 (No encontrado)

Esto está en Ubuntu con lo último de todo.

Estoy usando el código del servidor de http://socket.io/ para trabajar en la misma carpeta como client.php y eso funciona, llamado server.js, solo puerto modificado.


Como han dicho otros, cuando io se ejecuta en el lado del servidor, se sirve un servicio "automágico" de "socket.io.js", y se bifurca a los otros archivos js en su directorio lib.

Lo que deseo agregar es que esto no es intuitivo y, no, no puede hacer que su servidor web normal sirva este archivo; los errores se vuelven más extraños y aparentemente contradictorios (no es necesario, etc.). Este no es un archivo js normal, y deseo que todos los tutoriales lo enfaticen.

De todos modos, si está ejecutando detrás de nginx, por ejemplo, establezca la configuración del puerto en el mismo puerto asignado para el nodo, el puerto 3000 en mi caso. Utilicé ese puerto en el cliente así:

<script src="http://localhost:3000/socket.io/socket.io.js"></script>

... y luego también usó el puerto 3000 en el código del servidor: hay demasiadas formas / versiones en las que puede codificar el código del servidor-js para que un ejemplo haga cualquier cosa, pero confunde a la mayoría de los que usan "una forma diferente".


De hecho, tuve éxito en lograr que Apache sirviera estos archivos, de hecho, hoy.

Simplemente cree una copia (realmente copié los archivos, los enlaces blandos podrían estar bien, no lo intenté) del contenido de node_modules / socket.io / node_modules / socket.io-client / dist a su raíz web. Para mi instalación de socket.io (0.9.16) donde instalé socket.io globalmente estos dos comandos hicieron el truco:

sudo cp -av /usr/lib/node_modules/socket.io/node_modules/socket.io-client/dist /var/www/socket.io chown -R www-data:www-data /var/www/socket.io

Esto estaba en una caja de Ubuntu 13.10, la pila LAMP habitual instalada antes de que luego agregue node.js.

Ahora, mantener esta copia sincronizada a medida que se lanzan nuevas versiones de socket.io es un problema que aún no he intentado solucionar.

Aclamaciones


Intenté lo que thejh dice y funciona. Necesitaba especificar el host y el puerto. Para una aplicación de nodo que escucha en el puerto 81, necesitaba especificar el puerto 81 en el javascript del cliente. Nevermind /socket.io/socket.io.js no existe en vhost, el nodo lo compensa en tiempo de ejecución.


La inclusión de su biblioteca ( /socket.io/socket.io.js ) en la codificación del navegador de su cliente probablemente estuvo bien. Pero puede estar apuntando a la copia incorrecta de socket.io.js Si instaló socket.io usando ( npm install socket.io ), es posible que desee buscar en el siguiente directorio la versión de cliente de socket.io.js :

C:/Program Files (x86)/nodejs/node_modules/socket.io/node_modules/socket.io-client/dist/socket.io.js

Si está allí, entonces es posible que desee copiar ese módulo en su directorio de publicación web O, como alternativa, puede cambiar la ruta física a la que apunta su directorio virtual.


Si su script no viene de su servidor web, esto no funcionará:

<script src="/socket.io/socket.io.js"></script>

Tienes que indicar explícitamente el host y el puerto:

<script src="http://localhost:<port>/socket.io/socket.io.js"></script>



Tuve el mismo problema y confirmo que la solución de @ thejh funcionó. Sin embargo, no estaba seguro de "qué" era el servidor cuando leí su recomendación. Tengo MAMP ejecutándose en el puerto 80. Y el siguiente código sería el "servidor node.js", que se ejecuta en el puerto 8001.

Una vez que inicié el servidor node.js (ejecuté el código a continuación), una visita a http://localhost:4001/socket.io/socket.io.js devuelve el archivo javascript.

/* Node.js server */ var sys = require(''sys''); var io = require(''socket.io''); var http = require(''http'') server = http.createServer(function(req, res) { res.writeHead(200, {''Content-Type'': ''text/html''}); res.write(''http server started''); res.end(); }); server.listen(4001); // socket.io var socket = io.listen(server); socket.on(''connection'', function(client) { client.on(''message'', function(message) { // We''re in! console.log(''received client message ''+ message); }); client.on(''disconnect'', function() {}); socket.send(''welcome to the local node.js server!''); });

Para aquellos dentro de Drupal, drupal_add_js(''http://localhost:4001/socket.io/socket.io.js'', array(''type'' => ''external'', ''group'' => JS_LIBRARY)); dentro de un hook_init hace el truco.