0

I have Setup a Node Js Server. Right now I am fetching records of all users from Database.

Now if I want a specific User of a specific Id , how can I pass it to Node Js ?

For Example : We do in PHP : $_GET['id']; I want the same thing in Node JS.

Here is my Server Code :

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

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

// creating the server ( localhost:8000 )
app.listen(8000);


/*
*
* HERE IT IS THE COOL PART
* 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 );
        }
    });
    socket.on('ddd', function (name) {
        socket.username=name;
    });


    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 );
    });
};
3
  • You don't have to reinvent the wheel here. You can use express server which parses the body and gives the query string your you. Commented Nov 5, 2013 at 9:16
  • 1
    WebSockets don't have GET or POST variables. To send a parameter with socket.io, you have to .emit() an event with it in the data Object. Commented Nov 5, 2013 at 9:23
  • @JonathanLonowski Can you give me a simple example ? Commented Nov 5, 2013 at 9:34

1 Answer 1

1

First you have to embed the socket.io JavaScript for client side:

script(rel="text/javascript" src="/js/libraries/socket.io.min.js");


Then you connect to your socket server like this:

var socket = io.connect("https://localhost:8080");


After you connected, you can fire off events:

button.on("click", function(){
    socket.emit("event-name", { userId : 2 });
});


On server side you have the corresponding listener:

socket.on("event-name", function(data){
    console.log(data.userId); // logs: 2

    var query = // ...

    socket.emit("response", query);
});


On client side yet again, you retrieve the response:

socket.on("response", function(data){
    console.log(data); // logs: the query
});


To determine which client should receive an emit please see:

socket.io rooms or namespacing?

For authorizing please see:

https://github.com/LearnBoost/socket.io/wiki/Authorizing

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.