I am completely new to Nodejs and try to get to know him. Well, I'm currently trying to push notifications in a web browser if any changes occur in the database. I have a piece of code that I used to use for testing. The following code works fine to send updates to browsers when the contents of the database table change:
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, pollingTimer_2; // 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(); } socket.on('disconnect', function() { var socketIndex = connectionsArray.indexOf(socket); console.log('socket = ' + socketIndex + ' disconnected'); if (socketIndex >= 0) { connectionsArray.splice(socketIndex, 1); } }); console.log('A new socket is connected!'); connectionsArray.push(socket); }); 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
<html> <head> <title>Push notification server streaming on a MySQL db</title> <style> dd,dt { float:left; margin:0; padding:5px; clear:both; display:block; width:100%; } dt { background:#ddd; } time { color:gray; } </style> </head> <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> </html>
Now that you see that the server is currently listening on port 8000 . I'm just wondering how can I change it to listen to a specific url? Because if I am going to implement a server in a project, then I am not going to use url to listen on ports? Rather, I want to use it as a simple URL, so how can I smoothly send a notification if any user is connected to a specific URL?
Any help?