如何使用socket.io将数据库中的更改推送到客户端?

时间:2013-06-04 16:35:24

标签: javascript node.js socket.io

我正在开发一个应用程序,当数据库发生更新时,该应用程序会将数据推送到客户端。麻烦的是node.js上的websocket在与节点不同的端口上侦听数据库。我之前的那个人写了一段代码,然后把它丢给我。该节点看起来有点像这样:

var handler=http.createServer(function(req, res){
session(req, res, function(req, res, body) {
    if (!req.session || !req.session.data || !req.session.data.uid || req.session.data.uid == '' || !req.session.data.role || req.session.data.role =='') {
        var uri = url.parse(req.url).pathname;
    if(req.method == 'GET' && uri =="/attendance-node/getMonthFromReport") {
        var uri = url.parse(req.url).pathname;
        var url_parts = url.parse(req.url,true);
        processgetMonthFromReport(req, res, uri, url_parts.query);
        return;
    }
        res.writeHead(401, {"Content-Type": "text/plain"});  
        res.write("401 Unauthorized");
        res.end();
        return;
    }
    if(req.method == 'POST') {
        var uri = url.parse(req.url).pathname;
        var qs = require('querystring');
        var POSTVAR = qs.parse(body, '&', '=', {"maxKeys" : 0});
        //var POSTVAR=JSON.parse(body);
        handleRequest(req, res, uri, POSTVAR);
    }

    if (req.method=='GET') {
        var uri = url.parse(req.url).pathname;
        var url_parts = url.parse(req.url,true);
        handleRequest(req, res, uri, url_parts.query);

    }
});
}).listen(3014,"127.0.0.1");

var io = require('socket.io').listen(8077,"127.0.0.1");
sys.puts("websocket Server running on port 8077");

io.configure(function () {
io.set('transports', ['websocket', 'flashsocket', 'xhr-polling','jsonp-polling']);
io.set('log level', 0);
});
io.sockets.on('connection', function (socket) {
io.sockets.emit('init',"i am working via websocket");
});

正如您所看到的那样,节点正在侦听3014并且正在侦听8077上的套接字。现在我如何为套接字上收到的消息提供处理程序并将其转发给节点的客户端?

注意:我对Web开发还很陌生。所以基本上我被抛入水中,现在我正在学习游泳。

P.S。另外,套接字的客户端是什么样的?

P.P.S。已经处理了向套接字发送更新通知的数据库。它是一个POST请求。 Thanx提前!!

1 个答案:

答案 0 :(得分:0)

听起来你也希望在客户端(浏览器?)上也有socket.io。

我认为最好的解决方案是让socket.io在与Web服务器相同的端口上运行。但是,如果这不可能,并且您必须保持数据库与Web服务器分开使用的Web套接字,则可以运行两个socket.io实例。

一个将附加到Web服务器,另一个将附加到数据库。

var app = require('http').createServer(handler)
  , IO = require('socket.io')
  , web_io = IO.listen(app)
  , data_io = IO.listen(8080)
  , fs = require('fs')

app.listen(80);

function handler (req, res) {
  fs.readFile(__dirname + '/index.html',
  function (err, data) {
    if (err) {
      res.writeHead(500);
      return res.end('Error loading index.html');
    }

    res.writeHead(200);
    res.end(data);
  });
}

web_io.sockets.on('connection', function (socket) {
  socket.on('some_event', function (data) {
    console.log(data);
  });
});

data_io.sockets.on('connection', function (socket) {
  socket.on('database_update', function (data) {
    // Will be sent to everyone socket listening on port 80 (browser sockets mostlikely)
    web_io.sockets.emit('database_update', data);
  });

  socket.on('disconnect', function () {
    io.sockets.emit('user disconnected');
  });
});