将两个节点脚本合并为一个&将客户分组到房间

时间:2014-12-15 00:14:18

标签: node.js socket.io

我有两个独立的节点脚本(它们用于处理实时数据源)我试图将它们合并为一个脚本。下面是一个完整的脚本另一个脚本是相同的,除了它使用不同的数据库&提供MAP.room2的数据。产卵脚本。

我尝试将2个脚本合并在一起工作(只要它没有崩溃或任何东西)但是一旦一个客户端连接它请求来自两个数据库的所有数据,并且两个产生的脚本,而不仅仅是数据对于相关的房间。

有了谷歌,看起来socket.emit('MAP.room1', newObj)使用的是房间而不是命名空间。我从示例中无法理解的是,我需要对我需要更改的部分io.sockets.on进行更改,因此只有相关数据才会提供给相关客户端。客户端看起来像是发送emit "join"请求正确的数据。

var app = require('http').createServer(handler),
        io = require('socket.io').listen(app),
        fs = require('fs');
var cp = require('child_process');
var tail = cp.spawn('/var/www/html/test/test/room1-db.rb');

app.listen(8000);

function handler(req, res) {
        fs.readFile('/var/www/html/test/updates/test.html', function (err, data) {
        if (err) {
        console.log(err);
        res.writeHead(500);
        return res.end('Error loading webpage');
        }
            res.writeHead(200);
            res.end(data);
        });
}

io.sockets.on('connection', function (socket) {
       console.log();

    //Read from mongodb//
    var connection_string = '127.0.0.1:27017/room1-web';
    var mongojs = require('mongojs');
    var db = mongojs(connection_string, ['items']);
    var ls = db.collection('items');
    db.items.find({}, {'_id': 0, "data.time":0}).forEach(function(err, doc) {
        if (err) throw err;
        if (doc) { socket.emit('MAP.room1', doc); }
});

// Get updates from ruby script //
        tail.stdout.on('data', function(chunk) {
        var closer = chunk.toString()

        var sampArray = closer.split('\n');
        for (var i = 0; i < sampArray.length; i++) {
        try {
                var newObj = JSON.parse(sampArray[i]);

// DO SOCKET //
socket.emit('MAP.room1', newObj);
} catch (err) {
}}  
});});

客户端网页连接以下内容; '+ t'在其他地方定义,在我的示例中,它将是room1和room2

function startDiagram(t, e) {
    var n = io.connect(e);
    n.on("connecting", function () {
    n.emit("join", t), $("#room-map").fadeTo(0, 1)
    }), n.on("MAP." + t, function (t) {
        logMessage(t), updateMapElement(t)
    })
}

任何人都可以指出我需要改变的正确方向,以使其发挥作用。

1 个答案:

答案 0 :(得分:0)

因此,在了解了客户端的回调是如何工作的之后,我能够真正地合并脚本&amp;根据客户端发回的内容使用if语句。

socket.on('join', function(mapname) {
\\ do socket stuff here\\ }

if (mapname == 'room1') {
\\the read correct room from db\\ }

if (mapname == 'room2') {
\\the read correct room from db\\ }

这是一个肮脏的黑客&amp;我需要完全重新理解套接字/节点如何工作以使某些事情变得更加实用,但这让我走了一步。