简体   繁体   中英

returns null mysql nodejs

please have a look at the dbfn.js file

/*database function file;*/

var db = require('./connection');

function check_conn(){
    if(db){
        console.log('We are connected to Database server'.bgGreen);
        return true;
    }else{
        console.log('We are not connected to DataBase server'.bgRed);
        return false;
    }
}

module.exports = {

    testCon : function(){
        if(check_conn() === true){
            return 'We are connected to DB';
        }else return 'We are not connected to DB';
    },

    get_user : function(){
        db.query('SELECT * FROM users',function(err,results,fields){
            if(err){
                console.log(err)
                return err;
            }
            if(results){
                console.log(results);
                return results;
            }
            console.log('nothing...');
        });
    }
};

Now, look at routes.js file

var db = require('./dbfn');

module.exports = function(app){

    /*
        Routing starts here
    */

    //root route
    app.get('/', function(req, res){
        res.render('index.ejs');
    });

    //test route
    app.get('/test',function(req,res){

        var x = db.get_user();
        console.log(x);
        res.writeHead(200, {'Content-Type': 'text/json'});
        res.json(x);
    });



    //default it should stay at bottom
    app.get('*',function (req, res) {
        //res.redirect('/');
        res.send(404);
    });
}

console.log on dbfn file writes full object from MySQL database but when I call it on routes.js file as var x it null I really don't understands how actually I can overcome with that. Yes, I am new student to NodeJs

Thanks.

You can't return from an asynchronous call inside a synchronous function. Instead, you need to pass a callback to get_user() like this:

dbfn.js

var db = require('./connection');

function check_conn(){
    if(db){
        console.log('We are connected to Database server'.bgGreen);
        return true;
    }else{
        console.log('We are not connected to DataBase server'.bgRed);
        return false;
    }
}

module.exports = {

    testCon : function(){
        if(check_conn() === true){
            return 'We are connected to DB';
        }else return 'We are not connected to DB';
    },

    get_user : function(cb){
        db.query('SELECT * FROM users',function(err,results,fields){
            if(err){
                console.log(err)
                cb(err);
            }
            if(results){
                console.log(results);
                cb(null, results);
            }
            console.log('nothing...');
        });
    }

};

routes.js

var db = require('./dbfn');

module.exports = function(app){

    /*
        Routing starts here
    */

    //root route
    app.get('/', function(req, res){
        res.render('index.ejs');
    });

    //test route
    app.get('/test',function(req,res){

        db.get_user(function(err, response) {
            if(err) {
                // handle error
            }
            else {
                var x = response;
                console.log(x);
                res.writeHead(200, {'Content-Type': 'text/json'});
                res.json(x);
            }
        });

    });

    //default it should stay at bottom
    app.get('*',function (req, res) {
        //res.redirect('/');
        res.send(404);
    });
}

Now, the code within the callback will only fire once the DB query has completed.

Update your query function with a callback:

get_user : function(callback){
        db.query('SELECT * FROM users',function(err,results,fields){
            if(err){
                console.log(err)
                callback(err);
            }
            if(results){
                console.log(results);
                callback(results;
            }
            console.log('nothing...');
        });
    }

Then next in your routes check the results in the callback function

app.get('/test',function(req,res){

        db.get_user(function(result){
         console.log(result);
     });
 });

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM