2017-06-06 71 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); 
    }); 
});