Socket.io在不同的文件中

时间:2013-09-20 13:53:33

标签: javascript node.js express socket.io

要在不同的文件中使用io对象,我使用下面的方法..我似乎没有得到编译错误。所以io在users.js文件中被“定义”..但我似乎没有发出任何事件。有没有人看到这个问题?

app.js

var app = require('express')()
  , server = require('http').createServer(app)

global = require('./global.js');
global.io = require('socket.io').listen(server);
global.io.configure(function () { 
  global.io.set("transports", ["xhr-polling"]); 
  global.io.set("polling duration", 10); 
});
// express settings
require('./config/express')(app, config, passport)

require('./config/passport')(passport, config, env)

// Bootstrap routes
require('./config/routes')(app,passport)

var port = process.env.PORT || 3000
server.listen(port)

global.js

var Global = {
    io : { }
};    
module.exports = Global;

routes.js

var users = require('../app/controllers/users')

module.exports = function (app, passport) {
    app.post('/incomingFake', users.getFake);
}

users.js

var global = require('../../global.js')

exports.getFake = function(req, res){
    global.io.sockets.on('connection', function(socket) {
        socket.broadcast.emit('email', req.body);
    });

    User.findAndStoreEmail(senderEmail, email ,function(){
        res.writeHead(200, {'content-type': 'text/plain'})
        res.end('Message Received. Thanks!\r\n')
    })


}

我尝试在前端

的主干集合中收到此内容
define([
    'jquery',
    'underscore',
    'backbone',
    'Email',
    'marionette',
    'socketio'
], function ($, _, Backbone, emailModel, Marionette, io) {
    'use strict';

    var Emails = Backbone.Collection.extend({

        url : '/emails',
        model : emailModel,

        initialize : function() {
            var socket = io.connect('http://localhost:3000');
             socket.on('email', function (data) {
                console.log("i got the socket connection");
                console.log(data);
            });
        }

    });

    return Emails;
});

编辑:

我意识到了什么!我认为这可能有很大的帮助来解决问题,我实际上收到连接事件和套接字发出的东西,但这一切都发生在页面加载..我希望这个事件只发出'getFake'函数被调用

1 个答案:

答案 0 :(得分:2)

因为您正在尝试根据客户端所在的路径管理连接。

您可以尝试Socket.io namespaces

  

表示在由路径名标识的给定范围下连接的套接字池(例如:/ chat)。

     

默认情况下,客户端始终连接到/.

所以在服务器端代码上,一个简短的例子就是

io.of("/users").on("connection",function(socket){
 /*
  when connecting from /users, the socket object will be available here
 */
});

// all clients of pathname /users will get this message
io.of("/users").emit("greeding","Hello fellow users");