Push notification for web browser using nodejs

I am working on a project for real-time notifications whenever a database change occurs. I can get half the success so far, but have not been able to solve any problem. Currently my code reads a static file client.html

and displays the database changes in the file. This is normal. However, I want that instead of reading a static file, I want my file to server.js

read my project urls like this is my code http://localhost/dashboard/

instead http://localhost:8000.

:

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>

      

If I can redirect it to a project link, I can just copy the code client.html

to each page in my project (if required) to reflect the changes. I tried this for a couple of days but actually stumbled over how should I achieve this.

Any help would be much appreciated.

thank

+3


source to share





All Articles