Node.JS / JavaScript Async Call back issue

I am trying to accomplish the following (should be quite basic and I must be missing something trivial):

  1. Call a function with string that has a select statement
  2. Wait until the DB call completes and the rows (or json equivalent) is returned
  3. Populate http object to return back

Here is code:

    util.js
exports.execute = function( query){
    if (connection) {
        connection.query(query, function(err, rows, fields) {
            if (err) throw err;
            console.log("from Util - " + JSON.stringify(rows));
            return JSON.stringify(rows);
        });
    }
};

repo.js
var q =  "select * from xxx";
    var response;
    util.execute(q,  function (err,  r){
            if (err){
                throw err;
                console.log(err);
            }
            else {
                console.log(r);
                res.contentType('application/json');
                res.write(r);
                res.end();
            }
        });

My problem is while the code within util.js is called and I can see the json in console, it never comes back to the anonymous call back function in the repo.js.

What am I doing wrong here ?

Update

Thanks Ben I also found the solution in same line ... here is new code:

repo.js:
var send_data = function (req, res, r){
    res.contentType('application/json');
    res.write(r);
    res.end();

}
exports.all = function(req, res){
    var q =  "select * from XXX";
    var response;
    util.execute(req, res,q,  send_data);
};

util.js:
exports.execute = function(req, res,  query, callback){
    if (connection) {
        connection.query(query, function(err, rows, fields) {
            if (err) throw err;
            callback(req, res, JSON.stringify(rows))  ;
        });
    }
};

util.execute only accepts one parameter in your code. It needs to accept a second callback parameter in order to use it the way you do. (Callbacks aren't magic, they're just function calls)

Something like:

exports.execute = function(query,callback){
    if (connection) {
        connection.query(query, function(err, rows, fields) {
            if (err) throw err;
            console.log("from Util - " + JSON.stringify(rows));
            callback(null,JSON.stringify(rows));
        });
    }
};

If you'd like it to behave consistently and accept an error parameter, you might want fill that in:

exports.execute = function(query,callback){
    if (connection) {
        connection.query(query, function(err, rows, fields) {
            callback(err,null);
            console.log("from Util - " + JSON.stringify(rows));
            callback(null,JSON.stringify(rows));
        });
    }
};