0

I have a node.js server with mysql plugin from flexiage: Here goes my code:

connection.query('SELECT * FROM students WHERE email="'+req.body.username+'" AND password="'+req.body.password+'"',function(err,rows){


    if(rows.length)
    {

        var response=new Object;
        connection.query('SELECT * FROM forums WHERE id="'+rows[0].courseInterest+'"',function(err,course){

            response.subscription=course;
            response.username=rows[0].email;
            response.password=rows[0].password;
            response.loginFailed=false;
            response.loginAccepted=true;
        });

    }
    else
    {

        var response=new Object;
        response.username="";
        response.password="";
        response.loginFailed=true;
        response.loginAccepted=false;

    }
    console.log(response);
    res.setHeader('Content-Type', 'application/json');
    res.send(response);

});

In console i just get a blank object. It does go in the if condition but unable to attach prpoerties inside the construct. My guess is the variable scope because if i do a console.log inside connection.query construct it returns the result as desired. Please shed light.

Dan Ross
  • 3,596
  • 4
  • 31
  • 60
beNerd
  • 3,314
  • 6
  • 54
  • 92
  • Have a look at http://stackoverflow.com/q/14220321/218196, it's basically the same. – Felix Kling Jul 03 '13 at 07:50
  • possible duplicate of [How to return value from an asynchronous callback function?](http://stackoverflow.com/questions/6847697/how-to-return-value-from-an-asynchronous-callback-function) – Qantas 94 Heavy Aug 16 '14 at 10:37

1 Answers1

2

No, there's no scope problem, because scopes aren't block based in JavaScript and your variable declarations are hoisted.

The response is empty because the query function is asynchronous and you log and send the response before mysql answered.

Answer the browser in the callback :

var response=new Object;
var sendResponse = function(){
    console.log(response);
    res.setHeader('Content-Type', 'application/json');
    res.send(response);
}
connection.query('SELECT * FROM students WHERE email="'+req.body.username+'" AND password="'+req.body.password+'"',function(err,rows){
    if (rows.length) {
        response=new Object();
        connection.query('SELECT * FROM forums WHERE id="'+rows[0].courseInterest+'"',function(err,course){
            response.subscription=course;
            response.username=rows[0].email;
            response.password=rows[0].password;
            response.loginFailed=false;
            response.loginAccepted=true;
            sendResponse();
        })
    } else {
        response=new Object;
        response.username="";
        response.password="";
        response.loginFailed=true;
        response.loginAccepted=false;
        sendResponse();
    }
});
Denys Séguret
  • 372,613
  • 87
  • 782
  • 758