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

标签 javascript node.js websocket socket.io runtime-error

我有下一个文件结构:

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

服务器也可以是:servers=ticket,game

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 - error: uncaughtException: Object function (io) { return 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=[node, C:\Users\LUCIANO\Svn\Dropbox\Pr opios\WebGamePlatform\trunk\Development\NodeJSServer\app.js], rss=19689472, heap Total=10243584, heapUsed=5332216, loadavg=[0, 0, 0], uptime=14388.1320351, trace =[column=5, file=C:\Users\LUCIANO\Svn\Dropbox\Propios\WebGamePlatform\trunk\Deve lopment\NodeJSServer\app.js, function=, line=60, method=null, native=false, colu mn=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, f unction=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, line=497, method= Module.runMain, native=false, column=16, file=node.js, function=startup, line=11 9, method=null, native=false, column=3, file=node.js, function=null, line=901, m ethod=null, native=false], stack=[TypeError: Object function (io) { , return 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

关于javascript - NodeJS 使用 socket.io 动态加载套接字的服务器实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17267966/

相关文章:

javascript - 如何计算折线距离?

json - 使用 POST 数据从 Node.js 提供静态文件

kubernetes - Kubernetes 集群中的 Websocket 连接与 nginx-ingress

javascript - 为什么西里尔字母的正则表达式会漏掉一个字母?

javascript - Angularjs 文本/数据未显示

javascript - 如何将 Stripe Connect 与 Node.js 集成?

java - 如何使用 JAVA/Node.js 在 TELEGRAM 中向没有机器人的群组发送消息

node.js - 如何根据动态创建的请求数组执行多个axios get请求

java - 无法使用Tomcat和Maven的tomcat7-websocket插件启动WebSocket容器

python - 您如何使用 tornado.testing 创建 WebSocket 单元测试?