在Express 4和express-generator的/ bin / www中使用socket.io

所以这里是交易:我试图在一个快速项目中使用socket.io。 在Express Js 4发布后,我更新了我的快速生成器,现在应用程序的初始function进入./bin/www文件,包括那些variables(www文件内容: http : //jsfiddle.net/avMa5/ )

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

(通过npm install -g express-generator检查它,然后express myApp

就这么说吧,让我们回忆一下socket.io文档是如何要求我们解雇的:

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

好吧,但我不能在app.js里面做,就像推荐一样。 这应该在./bin/www中完成才能工作。 在./bin/www这是我能做些什么来得到它的工作:

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

确定这个工程,但我不能在任何地方使用io var,我真的不想把我的socket.io函数在www文件。

我想这只是基本的语法,但我不能得到这个工作,甚至没有使用module.exports = serverserver.exports = server也没有module.exports.io = app(io)上的WWW文件

所以问题是:我如何使用socket.io这个/ bin / www文件作为我的应用程序的起点?

我有一个在app.js中提供socket.io的解决scheme。

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; 

斌/ WWW:

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

这样,你可以在你的app.js中访问iovariables,甚至可以通过将module.exports定义为一个接受io作为参数的函数来使其对你的路由可用。

index.js

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

然后,在安装后将io传递到模块中:

app.js

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

事实certificate,这确实是一些基本的sintax问题….我从这个socket.io聊天教程得到这些线…

在./bin/www,就在var server = app.listen(.....)

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

所以现在我创build../sockets/base.js文件并把它放在里面:

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

是啊! 现在,它的工作原理…所以我想我真的没有select除了启动socket.io内/ bin / www,因为这是我的http服务器启动的地方。 目标是现在我可以在其他文件中构build套接字function,通过require('fileHere')(io);保持事物模块化require('fileHere')(io);

<3

旧的“expressjs”,一切都发生在文件“app.js”中。 所以socket.io绑定到服务器也发生在那个文件中。 (顺便说一句,仍然可以用旧的方法,并删除bin / www)

现在使用新的expressjs,它需要在“bin / www”文件中进行。

幸运的是,javascript / requirejs很容易传递对象。 正如Gabriel Hautclocq指出的那样,socket.io仍然在“app.js”中被“导入”,并通过一个属性附加到“app”对象

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

socket.io是通过在“bin / www”中附加服务器来实现的,

 app.io.attach(server); 

因为“应用程序”对象先前传入“bin / www”

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

这真的很简单

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

但是这样做“困难”的方式确保app.io现在拥有socke.io对象。

现在,如果你还需要在“routes / index.js”中使用这个socket.io对象,只需要使用相同的原理来传递该对象即可。

首先在“app.js”中,做

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

然后在“routes / index.js”

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

所以“io”被注入到“index.js”中。

一个不同的方法来启动socket.io ,不知道是否正确,但它的工作原理,我宁愿将所有相关的代码在一个地方:

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 

通过这种方式,所有的socket.io相关的代码在一个模块和函数中,我可以从应用程序的任何地方调用。

更新Gabriel Hautclocq的回应:

在www文件中,由于使用Socket.io更新,代码应如下所示。 附上现在听。

 /** * 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);` 

另外,让连接工作也需要实现客户端API。 这不是明确的具体,但没有它连接呼叫将无法正常工作。 该API包含在

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

将该文件包含在前端,并使用以下命令进行testing:

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

来自Cedric Pabst的 初学者教程
这里是构成应用聊天链接的简短基础:

使用express-generate和ejs引擎可以在每个.ejs文件标准路由中快速生成

编辑文件bin \ www并添加这个app.io.attach(服务器); 喜欢这个

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

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; 

index.ejs中编辑

  <head> <title><%= title %></title> <link rel='stylesheet' href='/stylesheets/style.css' /> <script src="/socket.io/socket.io.js"></script> //include jquery <script src="//code.jquery.com/jquery-1.11.3.min.js"></script> <script> var socket = io(); //define functions socket.emit sending to server (app.js) and socket.on receiving // 'new message' is for the id of the socket and $('#new-message') is for the button function sendFunction() { socket.emit('new message', $('#new-message').val()); $('#new-message').val(''); } // 'chat message' is for the id of the socket and $('#new-area') is for the text area socket.on('chat message', function(msg){ $('#messages-area').append($('<li>').text(msg)); }); </script> </head> <body> <h1><%= title %></h1> <h3>Welcome to <%= title %></h3> <ul id="messages-area"></ul> <form id="form" onsubmit="return false;"> <input id="new-message" type="text" /><button onclick="sendFunction()">Send</button> </form> </body> 

玩得开心:)并感谢Cedric Pabst

读完所有的评论后,我使用Socket.io服务器版本1.5.0提出了以下内容

我遇到的问题:

  1. var sockIO = require('socket.io')应该是var sockIO = require('socket.io') () 。 (信贷: 浙胡 )

  2. sockIO.attach应该是sockIO。 (信贷: 里克里佐 )

脚步

  1. 使用以下命令安装Socket.io:

     npm install --save socket.io 
  2. 将以下内容添加到app.js中

     var sockIO = require('socket.io')(); app.sockIO = sockIO; 
  3. bin / www中 ,在var server = http.createServer(app)之后 ,添加以下内容:

     var sockIO = app.sockIO; sockIO.listen(server); 
  4. 要testingfunction,请在app.js中添加以下行:

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

以前的一些答案不起作用,而另一些则过于复杂。 试试下面的解决scheme

安装服务器端和客户端socket.io节点模块:

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

服务器端

在服务器定义之后,将以下代码添加到bin / www中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' }); }); 

客户端

如果使用webpack,请将以下代码添加到您的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) }); 

完成。 访问您的网站并检查浏览器的js开发者控制台。