Então aqui está o negócio: estou tentando usar socket.io em um projeto expresso. Depois que o Express Js 4 foi lançado, eu atualizei meu express-generator e agora as funções iniciais do aplicativo vão para o ./bin/www
arquivo, incluindo aqueles vars (conteúdo do arquivo www: http://jsfiddle.net/avMa5/ )
var server = app.listen(app.get('port'), function() {..}
(verifique até npm install -g express-generator
láexpress myApp
Dito isso, vamos lembrar como o socket.io docs nos pede para dispará-lo:
var app = require('express').createServer();
var io = require('socket.io')(app);
Ok, mas eu não consigo fazer isso dentro do app.js, como recomendado. Isso deve ser feito em ./bin/www para funcionar. em ./bin/www isto é o que posso fazer para fazê-lo funcionar:
var io = require('socket.io')(server)
Ok, isso funciona, mas não posso usar o io var em qualquer outro lugar e realmente não quero colocar minhas funções socket.io no www
arquivo.
Acho que esta é apenas uma sintaxe básica, mas não consigo fazer funcionar, nem mesmo usando module.exports = server
ou server.exports = server
nemmodule.exports.io = app(io)
no arquivo www
Portanto, a questão é: como posso usar o socket.io tendo este arquivo / bin / www como ponto de partida do meu aplicativo?
fonte
./bin/www.
. Basta colocá-lo no mesmo lugar, onde vocêvar app
está.Respostas:
Tenho uma solução para disponibilizar socket.io em app.js.
app.js:
bin / www:
Dessa forma, você pode acessar a variável io em seu app.js e até mesmo disponibilizá-la para suas rotas definindo module.exports como uma função que aceita io como parâmetro.
index.js
Em seguida, passe io para o módulo após sua configuração:
app.js
fonte
app.io = io;
doapp.js
arquivoapp
objeto? Melhor usar símbolos ouapp.set()
.app.io = io
quando você poderia usar nomodule.exports = { app, io }
lugarUma abordagem um pouco diferente para iniciar
socket.io
, ela agrupa todos os códigos relacionados em um só lugar:bin / www
socketApi.js
app.js
Desta forma, todo o
socket.io
código relacionado em um módulo e função dele posso invocar de qualquer lugar no aplicativo.fonte
io.attach is not a function
Acontece que realmente era um problema básico de sintaxe ... Peguei essas linhas neste tutorial de bate-papo do socket.io ...
em ./bin/www, logo depois
var server = app.listen(.....)
então agora eu crio o arquivo ../sockets/base.js e coloco este pequeno companheiro dentro dele:
sim! Agora funciona ... Acho que realmente não tive outra opção a não ser iniciar o socket.io dentro de / bin / www, porque foi lá que meu servidor http foi iniciado. O objetivo é que agora eu possa construir funcionalidade de socket em outro (s) arquivo (s), mantendo a coisa modular, por
require('fileHere')(io);
<3
fonte
io.on('connection', function(socket) { res.render('connection.jade') });
O antigo "expressjs", tudo está acontecendo no arquivo "app.js". Portanto, a ligação do socket.io ao servidor também acontece naquele arquivo. (BTW, ainda é possível fazer da maneira antiga e remover bin / www)
Agora com os novos expressjs, isso precisa acontecer no arquivo "bin / www".
Felizmente, javascript / requirejs facilitou a passagem de objetos. Como Gabriel Hautclocq apontou, socket.io ainda é "importado" em "app.js" e é anexado ao objeto "app" por meio de uma propriedade
O socket.io é ativado conectando-se a ele no servidor em "bin / www"
porque o objeto "app" é passado para "bin / www" anteriormente
É realmente tão simples quanto
Mas fazer isso da maneira "difícil" garante que
app.io
agora segure o objeto socke.io.Agora, se você precisa desse objeto socket.io também em "routes / index.js" por exemplo, apenas use o mesmo princípio para passar esse objeto.
Primeiro em "app.js", faça
Em seguida, em "routes / index.js"
Portanto, "io" é injetado em "index.js".
fonte
Atualização da resposta de Gabriel Hautclocq :
No arquivo www, o código deve aparecer como o seguinte devido às atualizações com Socket.io. Anexar agora é Ouvir.
Além disso, fazer com que essa conexão funcione requer a implementação da API do lado do cliente também. Isso não é específico do Express, mas sem ele a chamada de conexão não funcionará. A API está incluída em
Inclua este arquivo no front end e teste com o seguinte:
fonte
Depois de ler todos os comentários, descobri o seguinte usando a versão do servidor Socket.io: 1.5.0
Problemas que encontrei:
var sockIO = require ('socket.io') deve ser var sockIO = require ('socket.io') () . (Crédito para: Zhe Hu )
sockIO.attach deve ser sockIO. ouvir (crédito para: rickrizzo )
Passos
Instale o Socket.io com o seguinte comando:
Adicione o seguinte ao app.js :
Em bin / www , após var server = http.createServer (app) , adicione o seguinte:
Para testar a funcionalidade, em app.js , você pode adicionar a linha:
fonte
Um tutorial para iniciantes de Cedric Pabst
aqui é um resumo básico do link para um bate-papo de aplicativo:
usando express-generate e o motor ejs utilizável em todo roteamento padrão de arquivo .ejs em express-generate
edite o arquivo bin \ www e adicione este app.io.attach (servidor); como isso
editar em app.js
editar em index.ejs
Divirta-se :) e muito obrigado a Cedric Pabst
fonte
Algumas respostas anteriores não estão funcionando e outras são excessivamente complicadas. Em vez disso, tente a seguinte solução ...
Instale os módulos de nó socket.io do lado do servidor e do lado do cliente:
Lado do servidor
Adicione o seguinte código a bin / www após a definição do servidor
var server = http.createServer(app);
:Cliente
Se estiver usando webpack, adicione o seguinte código ao arquivo entry.js do webpack :
Feito. Visite seu site e verifique o console do desenvolvedor js do navegador.
fonte