Usando o socket.io no Express 4 e express-generator’s / bin / www

Então, aqui está o acordo: Estou tentando usar o socket.io em um projeto expresso. Depois que o Express Js 4 foi lançado, eu atualizei o meu express-generator e agora as funções iniciais do aplicativo vão para o arquivo ./bin/www , incluindo aquelas vars (conteúdo do arquivo www: http://jsfiddle.net/avMa5/ )

 var server = app.listen(app.get('port'), function() {..} 

(verifique isso por npm install -g express-generator e depois express myApp

Dito isto, vamos lembrar como o socket.io docs nos pede para triggersr:

 var app = require('express').createServer(); var io = require('socket.io')(app); 

Ok, mas eu não posso fazer isso dentro do app.js, como recomendado. Isso deve ser feito em ./bin/www para funcionar. em ./bin/www isto é o que eu posso fazer para que funcione:

 var io = require('socket.io')(server) 

Ok isso funciona, mas eu não posso usar o io var em qualquer outro lugar, e eu realmente não quero colocar minhas funções socket.io no arquivo www .

Eu acho que isso é apenas syntax básica, mas eu não consigo fazer isso funcionar, nem mesmo usando module.exports = server ou server.exports = server nem module.exports.io = app(io) no arquivo www

Então a questão é: como posso usar o socket.io tendo este arquivo / bin / www como ponto de partida do meu aplicativo?

Eu tenho uma solução para tornar o socket.io disponível em app.js.

app.js:

 var express = require( "express" ); var socket_io = require( "socket.io" ); // Express var app = express(); // Socket.io var io = socket_io(); app.io = io; (...) // socket.io events io.on( "connection", function( socket ) { console.log( "A user connected" ); }); module.exports = app; // Or a shorter version of previous lines: // // var app = require( "express" )(); // var io = app.io = require( "socket.io" )(); // io.on( "connection", function( socket ) { // console.log( "A user connected" ); // }); // module.exports = app; 

bin / www:

 (...) /** * Create HTTP server. */ var server = http.createServer( app ); /** * Socket.io */ var io = app.io io.attach( server ); (...) 

Dessa forma, você pode acessar a variável io em seu app.js e até disponibilizá-la para suas rotas definindo module.exports como uma function que aceita io como um parâmetro.

index.js

 module.exports = function(io) { var app = require('express'); var router = app.Router(); io.on('connection', function(socket) { (...) }); return router; } 

Em seguida, passe io para o módulo depois que ele for configurado:

app.js

 // Socket.io var io = socket_io(); app.io = io; var routes = require('./routes/index')(io); 

Acontece que realmente era algum problema básico de syntax …. Eu tenho essas linhas deste tutorial de chat socket.io …

em ./bin/www, logo após var server = app.listen(.....)

 var io = require('socket.io').listen(server); require('../sockets/base')(io); 

então agora eu crio o arquivo ../sockets/base.js e coloco esse pequenino dentro dele:

 module.exports = function (io) { // io stuff here... io.on('conection..... } 

sim! Agora funciona … Então eu acho que eu realmente não tive outra opção além de iniciar o socket.io dentro de / bin / www, porque é onde meu servidor http foi iniciado. O objective é que agora eu possa construir funcionalidade de socket em outro (s) arquivo (s), mantendo a coisa modular, por require('fileHere')(io);

<3

Uma abordagem diferente para iniciar o socket.io , agrupa todo o código relacionado em um único local:

bin / www

 /** * Socket.io */ var socketApi = require('../socketApi'); var io = socketApi.io; io.attach(server); 

socketApi.js

 var socket_io = require('socket.io'); var io = socket_io(); var socketApi = {}; socketApi.io = io; io.on('connection', function(socket){ console.log('A user connected'); }); socketApi.sendNotification = function() { io.sockets.emit('hello', {msg: 'Hello World!'}); } module.exports = socketApi; 

app.js

 // Nothing here 

Desta forma, todo o código relacionado ao socket.io em um módulo e function dele eu posso invocar de qualquer lugar no aplicativo.

O antigo “expressjs”, tudo está acontecendo no arquivo “app.js”. Portanto, a binding socket.io ao servidor também acontece nesse arquivo. (BTW, ainda se pode fazer do jeito antigo, e remover bin / www)

Agora, com o novo expressjs, ele precisa acontecer no arquivo “bin / www”.

Felizmente, o javascript / requirejs facilitou a transmissão de objects. Como Gabriel Hautclocq apontou, o socket.io ainda é “importado” em “app.js” e é anexado ao object “app” por meio de uma propriedade.

 app.io = require('socket.io')(); 

O socket.io é feito ao vivo, anexando a ele o servidor em “bin / www”

 app.io.attach(server); 

porque o object “app” é passado para “bin / www” antes

 app = require("../app"); 

É tão simples quanto

 require('socket.io')().attach(server); 

Mas, ao fazer isso, a maneira “difícil” garante que o app.io agora tenha o object socke.io.

Agora, se você precisar desse object socket.io também em “routes / index.js”, por exemplo, use o mesmo princípio para passar esse object.

Primeiro em “app.js”, faça

 app.use('/', require('./routes/index')(app.io)); 

Então em “routes / index.js”

 module.exports = function(io){ //now you can use io.emit() in this file var router = express.Router(); return router; } 

Então, “io” é injetado em “index.js”.

Atualizar para resposta de Gabriel Hautclocq :

No arquivo www, o código deve aparecer como o seguinte devido a atualizações com Socket.io. Anexar agora é Ouvir.

 /** * Create HTTP server. */ var server = http.createServer(app); /** * Listen on provided port, on all network interfaces. */ server.listen(port); server.on('error', onError); server.on('listening', onListening); /** * Socket.io */ var io = app.io; io.listen(server);` 

Além disso, obter essa conexão para funcionar também requer a implementação da API do lado do cliente. Isso não é específico do Express, mas sem ele, a chamada de conexão não funcionará. A API está incluída no

 /node_modules/socket.io-client/socket.io.js. 

Inclua este arquivo no front end e teste com o seguinte:

 var socket = io.connect('http://localhost:3000'); 

Um tutorial para iniciantes de Cedric Pabst
Aqui estão os fundamentos curtos formam o link para um chat de aplicativo:

usando express-generate e o mecanismo ejs utilizável em todo o roteamento padrão do arquivo .ejs em express-generate

edite o arquivo bin \ www e adicione este app.io.attach (servidor); como isso

 ... /* * Create HTTP server. /* var server = http.createServer(app); /* * attach socket.io /* app.io.attach(server); /* * Listen to provided port, on all network interfaces. /* ... 

editar em app.js

 //connect socket.io ... var app = express(); // call socket.io to the app app.io = require('socket.io')(); //view engine setup app.set('views', path.join(_dirname, 'views')); ... ... //start listen with socket.io app.io.on('connection', function(socket){ console.log('a user connected'); // receive from client (index.ejs) with socket.on socket.on('new message', function(msg){ console.log('new message: ' + msg); // send to client (index.ejs) with app.io.emit // here it reacts direct after receiving a message from the client app.io.emit('chat message' , msg); }); }); ... module.exports = app; 

editar em index.ejs

   < %= title %>   //include jquery     

< %= title %>

Welcome to < %= title %>

    Divirta-se 🙂 e muito obrigado a Cedric Pabst

    Depois de ler todos os comentários, eu vim com o seguinte usando Socket.io Server Version: 1.5.0

    Problemas que encontrei:

    1. var sockIO = require (‘socket.io’) deve ser var sockIO = require (‘socket.io’) () . (Crédito para: Zhe Hu )

    2. sockIO.attach deve ser sockIO. listen (Crédito para: rickrizzo )

    Passos

    1. Instale o Socket.io com o seguinte comando:

       npm install --save socket.io 
    2. Adicione o seguinte ao app.js :

       var sockIO = require('socket.io')(); app.sockIO = sockIO; 
    3. Em bin / www , após var server = http.createServer (app) , adicione o seguinte:

       var sockIO = app.sockIO; sockIO.listen(server); 
    4. Para testar a funcionalidade, em app.js , você pode adicionar a linha:

       sockIO.on('connection', function(socket){ console.log('A client connection occurred!'); }); 

    Algumas respostas anteriores não estão funcionando e outras são excessivamente complicadas. Tente a seguinte solução em vez disso …

    Instale os módulos do nó socket.io do lado do servidor e do lado do cliente:

     npm install --save socket.io socket.io-client 

    Lado do servidor

    Adicione o seguinte código ao bin / www após a definição do servidor, var server = http.createServer(app); :

     /** * Socket.io */ var io = require('socket.io')(server); io.on("connection", function(socket){ console.log("SOCKET SERVER CONNECTION"); socket.emit('news', { hello: 'world' }); }); 

    Lado do cliente

    Se estiver usando o webpack, adicione o seguinte código ao seu arquivo webpack entry.js :

     var socket = require('socket.io-client')(); socket.on('connect', function(){ console.log("SOCKET CLIENT CONNECT") }); socket.on('news', function(data){ console.log("SOCKET CLIENT NEWS", data) }); 

    Feito. Visite seu site e verifique o console de desenvolvedor js do navegador.