Así que aquí está el trato: estoy tratando de usar socket.io en un proyecto express. Después de que se lanzó Express Js 4, actualicé mi generador expreso y ahora las funciones iniciales de la aplicación entran en el ./bin/www
archivo, incluidas esas vars (contenido del archivo www: http://jsfiddle.net/avMa5/ )
var server = app.listen(app.get('port'), function() {..}
(compruébalo npm install -g express-generator
y luegoexpress myApp
Dicho esto, recordemos cómo los documentos de socket.io nos piden que lo disparemos:
var app = require('express').createServer();
var io = require('socket.io')(app);
Ok, pero no puedo hacerlo dentro de app.js, como se recomienda. Esto debe hacerse en ./bin/www para que funcione. en ./bin/www esto es lo que puedo hacer para que funcione:
var io = require('socket.io')(server)
Ok, esto funciona, pero no puedo usar la var io en ningún otro lugar, y realmente no quiero poner mis funciones socket.io en el www
archivo.
Supongo que esta es solo una sintaxis básica, pero no puedo hacer que esto funcione, ni siquiera usando module.exports = server
o server.exports = server
ni module.exports.io = app(io)
en el archivo www.
Entonces, la pregunta es: ¿cómo puedo usar socket.io con este archivo / bin / www como punto de partida de mi aplicación?
fuente
./bin/www.
. Solo ponlo en el mismo lugar, dondevar app
está tu .Respuestas:
Tengo una solución para hacer que socket.io esté disponible en app.js.
app.js:
bin / www:
De esta manera, puede acceder a la variable io en su app.js, e incluso ponerla a disposición de sus rutas definiendo module.exports como una función que acepta io como parámetro.
index.js
Luego, pase io al módulo después de que esté configurado:
app.js
fuente
app.io = io;
en elapp.js
archivoapp
objeto? Mejor use símbolos oapp.set()
.app.io = io
cuando podría usarmodule.exports = { app, io }
en su lugar?Un enfoque un poco diferente para iniciar
socket.io
, agrupa todo el código relacionado en un solo lugar:bin / www
socketApi.js
app.js
De esta manera,
socket.io
puedo invocar todo el código relacionado en un módulo y su función desde cualquier lugar de la aplicación.fuente
io.attach is not a function
Resulta que realmente fue un problema básico de sintaxis ... Obtuve estas líneas de este tutorial de chat de socket.io ...
en ./bin/www, justo después
var server = app.listen(.....)
así que ahora creo el archivo ../sockets/base.js y pongo este pequeño dentro de él:
¡Si! Ahora funciona ... Así que supongo que realmente no tenía otra opción que iniciar socket.io dentro de / bin / www, porque ahí es donde se inició mi servidor http. El objetivo es que ahora pueda construir la funcionalidad de socket en otro (s) archivo (s), manteniendo la cosa modular, por
require('fileHere')(io);
<3
fuente
io.on('connection', function(socket) { res.render('connection.jade') });
El antiguo "expressjs", todo sucede en el archivo "app.js". Entonces, el enlace de socket.io al servidor también ocurre en ese archivo. (Por cierto, todavía se puede hacerlo a la antigua y eliminar bin / www)
Ahora, con el nuevo expressjs, debe suceder en el archivo "bin / www".
Afortunadamente, javascript / requirejs facilitó el paso de objetos. Como señaló Gabriel Hautclocq, socket.io todavía se "importa" en "app.js" y se adjunta al objeto "app" a través de una propiedad
El socket.io se activa adjuntando el servidor en "bin / www"
porque el objeto "app" se pasó a "bin / www" anteriormente
Es realmente tan simple como
Pero hacerlo de la manera "difícil" asegura que
app.io
ahora contenga el objeto socke.io.Ahora, si necesita este objeto socket.io también en "rutas / index.js", por ejemplo, simplemente use el mismo principio para pasar ese objeto.
Primero en "app.js", haz
Luego, en "rutas / index.js"
Entonces "io" se inyecta en "index.js".
fuente
Actualización de la respuesta de Gabriel Hautclocq :
En el archivo www, el código debería aparecer como el siguiente debido a las actualizaciones con Socket.io. Attach ahora es Escuchar.
Además, para que esa conexión funcione también es necesario implementar la API del lado del cliente. Esto no es específico de Express, pero sin él, la llamada de conexión no funcionará. La API está incluida en
Incluya este archivo en la interfaz y pruebe con lo siguiente:
fuente
Después de leer todos los comentarios, se me ocurrió lo siguiente usando la versión del servidor Socket.io: 1.5.0
Problemas con los que me encontré:
var sockIO = require ('socket.io') debería ser var sockIO = require ('socket.io') () . (Crédito a: Zhe Hu )
sockIO.attach debe ser sockIO. escuchar (Crédito a: rickrizzo )
Pasos
Instale Socket.io con el siguiente comando:
Agregue lo siguiente a app.js :
En bin / www , después de var server = http.createServer (app) , agregue lo siguiente:
Para probar la funcionalidad, en app.js , puede agregar la línea:
fuente
Un tutorial para principiantes de Cedric Pabst
aquí son los conceptos básicos breves del enlace para un chat de aplicación:
usando express-generate y el motor ejs utilizable en cada enrutamiento estándar de archivos .ejs en express-generate
edite el archivo bin \ www y agregue este app.io.attach (servidor); Me gusta esto
editar en app.js
editar en index.ejs
Diviértete :) y muchas gracias a Cedric Pabst
fuente
Algunas respuestas anteriores no funcionan y otras son demasiado complicadas. En su lugar, pruebe la siguiente solución ...
Instale los módulos de nodo socket.io del lado del servidor y del lado del cliente:
Lado del servidor
Agregue el siguiente código a bin / www después de la definición del servidor
var server = http.createServer(app);
:Lado del cliente
Si usa webpack, agregue el siguiente código a su archivo webpack entry.js :
Hecho. Visite su sitio y compruebe la consola de desarrollador js del navegador.
fuente