下面是交易:我尝试在一个express项目中使用Socket.io。在Express JS4发布之后,我更新了我的Express生成器,现在应用程序的初始函数进入./bin/www
文件,包括那些VAR(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.io=server
或server.exports=server
或module.exports.io=app(io)
在www文件上
所以问题是:如何使用socket.io,将这个/bin/www文件作为应用程序的起点?
我有一个使socket.io在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 );
(...)
这样,您就可以访问app.js中的io变量,甚至可以通过将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);
启动socket.io
的方法稍有不同,它将所有相关代码分组在一个位置:
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
这样,所有socket.io
相关的代码都在一个模块中,并且我可以从应用程序中的任何地方调用其中的函数。
结果发现这真的是一些基本的sintax问题。。。。我从这个socket.io聊天教程中得到了这些代码。。。
在。/bin/www上,就在var server=app.listen(……)
之后
var io = require('socket.io').listen(server);
require('../sockets/base')(io);
现在我创建了。。/sockets/base.js文件,并将这个小家伙放入其中:
module.exports = function (io) { // io stuff here... io.on('conection..... }
耶!现在起作用了。。。所以我想我除了在/bin/www内启动socket.io之外别无选择,因为我的http服务器就是在那里启动的。现在我的目标是,通过require('file here')(io);
,我可以在其他文件中构建套接字功能,保持模块化
<3