将socket.io事件分成不同的文件

时间:2015-03-23 07:19:18

标签: javascript node.js socket.io

我在尝试将socket.io事件分别编入不同的文件时遇到了麻烦而不是将所有内容放入单个文件,即app.js;

// app.js

io.on('connection', function(socket) {

    socket.on("helloword", require("./controllers/socket/helloworld"));
    // a bunch of other events
});

// controllers/socket/helloworld.js

module.exports = function(data) {

    if (data)
        socket.emit('response', { lorem: "ipsum" });
}

问题是socket.io没有通过" socket"变量到所需的功能,所以我无法将响应发送回用户,所以我来到这个解决方法;

// app.js

io.on("connection", function(socket) {

    // socket.io("helloworld", require("./controllers/socket/helloworld")(socket));
    // although the code above prints successfully console.log(socket) invoked at
    // the required file but as soon as its printed socket.io throws " TypeError: 
    // listener must be a function.
    require("./controller/socket/helloworld")(socket);
    // a bunch of other events
});

// controllers/socket/helloworld.js

module.exports = function(socket) {

    socket.on("helloworld", function(data) {

        if (data)
            socket.emit('response', { lorem: "ipsum" });
    }

    // others events regarding the same subject by the file.
}

我仍然认为这不是一种好的做法,也不是最可靠的做法。我也无法通过socket.io文档找到解决我的问题的方法,也没有找到一个帮助我通过我的问题来解决的相关问题。

PS:这个question基本上已经开始使用相同的战术

1 个答案:

答案 0 :(得分:1)

这是一个干净的解决方案,使用工厂在您的app.js中保留路线:

// app.js
io.on('connection', function(socket) {

    socket.on("helloword", require("./controllers/socket/helloworld")(socket));
    // a bunch of other events
});

// controllers/socket/helloworld.js
module.exports = function(socket){
    return function(data) {
        if (data) socket.emit('response', { lorem: "ipsum" });
    }
}