提问者:小点点

在Express4和Express-Generator的/bin/www中使用socket.io


下面是交易:我尝试在一个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-generatorexpress 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=serverserver.exports=servermodule.exports.io=app(io)在www文件上

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


共3个答案

匿名用户

我有一个使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