繁体   English   中英

NodeJS使用socket.io动态加载套接字的服务器实例

[英]NodeJS Dynamically Load server instancess for a socket using socket.io

我有下一个文件结构:

app.js - Server

data
    |__ config.txt   -  configuration
    |__ logs

srv
    |__ ticket.js    - ticket server
    |__ game.js      - game server

app.js从“ config.txt”读取服务器以加载和运行

config.txt

port=7891
servers=ticket

服务器也可以是:服务器=门票,游戏

ticket.js

var init = function(io) {
    return io.of('/ticket')
    .on('connection', function (socket) {

        socket.on('message', function () { 

        });

        socket.on('disconnect', function () { 

        });

    });
};

module.exports = init;

app.js

//
//  Requires
//
var _ = require('underscore')._;

var fs = require('fs');
var io = require('socket.io');
var logger = require('./mod/log.js');

//
//  Configuration
//

var options = {
    port: 6789,
    modules: [],
    servers: []
};

// Reads config.txt and insert values into "var options"
if(fs) {
    var config = fs.readFileSync("data/config.txt").toString().replace("\r\n", "\n").split("\n");
    var line, t, val;

    for(i in config) {
        if(config[i].indexOf("=") === -1)
            continue;

        line = config[i].split("=");
        t = Object.prototype.toString.call(options[line[0]]);
        t = t.slice(t.indexOf(" ")+1, t.length-1).toLowerCase();

        switch(t) {
            case 'number':
                val = parseInt(line[1]);
            break;

            case 'array':
                val = line[1].replace(", ", ",").split(",");
            break;

            default:
                val = line[1];
            break;
        }

        options[line[0]] = val;
    }

    logger.info("Configuration loaded");
    logger.info(options);

    io = io.listen(options.port);
}

// Starts all servers specified into config.txt
for(var i in options.servers) {
    logger.info("Starting server: "+options.servers[i]);

    var sv = require('./srv/'+ options.servers[i] + '.js');
    logger.info('./srv/'+ options.servers[i] + '.js');
    sv.init(io); //< HERE THROWS THE ERROR (*)

    logger.info("Ready");
}

(*)错误是下一个:

2013-06-24T04:16:47.513Z-错误:uncaughtException:对象函数(io){返回io.of('/ ticket').on('connection',function(socket){

  socket.on('message', function () { }); socket.on('disconnect', function () { }); }); } has no method 'init' date=Mon Jun 24 2013 01:16:47 GMT-0300 (Hora estándar de Argentina), pid=3316, uid=null, gid=null, 

cwd = C:\\ Users \\ LUCIANO \\ Svn \\ Dropbox \\ Propi os \\ WebGamePlatform \\ trunk \\ Development \\ NodeJSServer,execPath = C:\\ Program Files(x8 6)\\ nodejs \\ node.exe,version = v0.10.8,argv = [节点,C:\\ Users \\ LUCIANO \\ Svn \\ Dropbox \\ Pr opios \\ WebGamePlatform \\ trunk \\ Development \\ NodeJSServer \\ app.js],rss = 19689472,heap Total = 10243584,heapUsed = 5332216,loadavg = [0,0, 0],正常运行时间= 14388.1320351,跟踪= [列= 5,文件= C:\\ Users \\ LUCIANO \\ Svn \\ Dropbox \\ Propios \\ WebGamePlatform \\ trunk \\ Deve lopment \\ NodeJSServer \\ app.js,function =,line = 60,方法= null,native = false,column = 26,file = module.js,function = Module._compile,line = 456,method = _compile,nati ve = false,column = 10,file = module.js,function = Object .Module._extensions..js,lin e = 474,method = Module._extensions..js,native = false,column = 32,file = module.js,function = Module.load,line = 356,method = load ,native = false,column = 12,file = module .js,function = Function.Module._load,line = 312,method = Module._load,native = false,column = 10,file = module.js,function = Function .Module.runMain,第49行 7,方法= Module.runMain,本机=假,列= 16,文件= node.js,函数=启动,行= 11 9,方法=空,本机=假,列= 3,文件= node.js,函数= null,line = 901,method = null,native = false],stack = [TypeError:对象函数(io){,返回io.of('/ ticket'),
.on('connection',function(socket){,,
socket.on('message',function(){,,});
socket.on('disconnect',function(){,,});
});

我怎样才能解决这个问题?

您正在导出的是函数,而不是对象。 这意味着正确的调用应该是sv(io)而不是sv.init(io)
如果要公开init函数,则必须使用module.exports.init = init

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM