使用nodejs将通知推送到Web浏览器

时间:2014-10-28 03:00:53

标签: javascript node.js push-notification

每当发生任何数据库更改时,我一直在处理实时通知项目。到目前为止,我能够取得一半成功,但无法解决某些问题。目前,我的代码读取静态client.html文件并显示文件中的数据库更改。哪个好。但是,我想要实现的是,不是阅读静态文件,而是希望我的server.js文件读取我的项目网址,例如http://localhost/dashboard/而不是http://localhost:8000.以下是我的代码:< / p>

Server.js

var app = require('http').createServer(handler).listen(8000),
  io = require('socket.io').listen(app),
  fs = require('fs'),
  mysql = require('mysql'),
  connectionsArray = [],
  connection = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: '',
    database: 'nodejs',
    port: 3306
  }),
  POLLING_INTERVAL = 3000,
  pollingTimer;



// If there is an error connecting to the database
connection.connect(function(err) {
  // connected! (unless `err` is set)
  console.log(err);
});



// on server started we can load our client.html page
function handler(req, res) {
  fs.readFile(__dirname + '/client.html', function(err, data) {
    if (err) {
      console.log(err);
      res.writeHead(500);
      return res.end('Error loading client.html');
    }
    res.writeHead(200);
    res.end(data);
  });
}


/*
 * This function loops on itself since there are sockets connected to the page
 * sending the result of the database query after a constant interval
 *
 */

var pollingLoop = function() {

  // Doing the database query
  var query = connection.query('SELECT * FROM users'),
    users = []; // this array will contain the result of our db query

  // setting the query listeners
  query
    .on('error', function(err) {
      // Handle error, and 'end' event will be emitted after this as well
      console.log(err);
      updateSockets(err);
    })
    .on('result', function(user) {
      // it fills our array looping on each user row inside the db
      users.push(user);
    })
    .on('end', function() {
      // loop on itself only if there are sockets still connected
      if (connectionsArray.length) {
        pollingTimer = setTimeout(pollingLoop, POLLING_INTERVAL);

        updateSockets({
          users: users
        });
      }
    });

};


// creating a new websocket to keep the content updated without any AJAX request
io.sockets.on('connection', function(socket) {

  console.log('Number of connections:' + connectionsArray.length);
  // starting the loop only if at least there is one user connected
  if (!connectionsArray.length) {
    pollingLoop();

  }

});

var updateSockets = function(data) {
  // adding the time of the last update
  data.time = new Date();
  // sending new data to all the sockets connected
  connectionsArray.forEach(function(tmpSocket) {
    tmpSocket.volatile.emit('notification', data);
  });
};

Client.html

<body>
        <time></time>
        <div id="container">Loading ...</div>
<script src="socket.io/socket.io.js"></script>
<script src="http://code.jquery.com/jquery-latest.min.js"></script>
<script>

    // create a new websocket
    var socket = io.connect('http://localhost:8000');
    // on message received we print all the data inside the #container div
    socket.on('notification', function (data) {
    var usersList = "<dl>";
    $.each(data.users,function(index,user){
        usersList += "<dt>" + user.user_name + "</dt>\n" +
                     "<dd>" + user.user_desc + "\n" +
                        "<figure> <img class='img-polaroid' width='50px' src='" + user.user_img + "' /></figure>"
                     "</dd>";
    });
    usersList += "</dl>";
    $('#container').html(usersList);

    $('time').html('Last Update:' + data.time);
  });
</script>
</body>

如果我能够在项目链接上重定向它,那么我只需将client.html代码复制到我项目的每个页面(如果需要)以显示更改。我已经尝试了几天,但我真的发现我应该如何实现它。

任何帮助都将受到高度赞赏。

由于

0 个答案:

没有答案