2017-06-06 94 views
0

请看看在dbfn.js文件返回null的mysql的NodeJS

/*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...'); 
     }); 
    } 
}; 

现在,看看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){ 

     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上dbfn文件中写入从MySQL完整的对象数据库,但是当我在routes.js文件中将其作为var x调用它时,我实际上并不了解我实际上可以如何克服这一点。是的,我是NodeJs的新学生

谢谢。

+1

'nodejs'是异步。因此您需要将某个回调传递给该方法或使用'promise'来获取结果。 'var x = db.get_user();'在这段代码中,db仍然会执行,在这种情况下你会得到'undefined' –

回答

1

您不能从同步函数内的异步调用返回。相反,你需要一个回调传递给get_user()这样的:

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); 
    }); 
} 

现在,回调中的代码将只数据库查询完成后触发。

+0

不错,我完全错过了解异步和同步函数,但正如你所看到的,我们必须检查两次该答复,并为各种数据错误我可以拿出一些好的或任何良好的做法的代码? –

+0

@VishalPatel没问题!如果您想避免回调并使用其他方法,则可能需要查看JavaScript承诺。 – dan

0

更新你有一个回调查询功能:

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...'); 
     }); 
    } 
未来

然后在你的路线检查结果在回调函数

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

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