在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 = server
或server.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提出了以下内容
我遇到的问题:
-
var sockIO = require('socket.io')应该是var sockIO = require('socket.io') () 。 (信贷: 浙胡 )
-
sockIO.attach应该是sockIO。 听 (信贷: 里克里佐 )
脚步
-
使用以下命令安装Socket.io:
npm install --save socket.io
-
将以下内容添加到app.js中 :
var sockIO = require('socket.io')(); app.sockIO = sockIO;
-
在bin / www中 ,在var server = http.createServer(app)之后 ,添加以下内容:
var sockIO = app.sockIO; sockIO.listen(server);
-
要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开发者控制台。