2016-12-03 110 views
0

我對編碼和node.js非常陌生,特別是這可能是一個愚蠢的問題 - 但是我爲mySQL數據庫查詢讀取的所有示例都以只是將查詢結果記錄到控制檯...我想爲我的web應用程序做什麼(或者至少是我想要做的)是將查詢結果作爲函數的產品返回,以便我可以允許我的。 ejs文件來使用JSON對象。如何從node.js中的mySQL查詢返回JSON對象

無論我嘗試將我的.ejs文件接收到「Hello World」作爲getDriver()的產品,情況都是如此。我想它接收'行'(即我的SQL查詢返回的JSON對象)

我可以看到控制檯中的JSON結果&它看起來很完美..我似乎無法讓它'存在」功能:(

var express = require('express'); 
var router = express.Router(); 
var mysql = require('mysql'); 
/* GET about page. */ 
router.get('/', function(req, res, next) { 
    res.render('SQLtest', { title: 'SQL test', 
         result: getDriver() // I want this to be my JSON object 
    }); 
}); 

module.exports = router; 


function getDriver() { 
    var result = "Hello World"; // my .ejs see's this 
     var connection = mysql.createConnection(
      { 
       host: 'localhost', 
       user: 'root', 
       password: 'password', 
       database: 'my database', 
       port: 3306 
      } 
     ); 

     connection.query("SELECT * FROM my_table", 
      function (err, rows) { 
       if (err) { 
       console.log(err); 
       } 

       console.log(rows); // query result looks fine as JSON object 
       result = rows; // now change "Hello World" to the JSON object 
      } 
     ); 
    return result; // however this still = "Hello World" :(
} 

回答

3

數據庫查詢是一個異步調用之外 - 這意味着return result聲明可以執行之前返回查詢結果和result值是通過result = rows更新

你需要做的是引入一個回調函數作爲您的getDriver函數中的參數。你的代碼看起來像這樣(我感動的數據庫連接代碼出getDriver功能):

//You should move this out of the function - you want to set it once 
var connection = mysql.createConnection(
    { host: 'localhost', 
     user: 'root', 
     password: 'password', 
     database: 'my database', 
     port: 3306 
    }); 

function getDriver(callback) {  
     connection.query("SELECT * FROM my_table", 
      function (err, rows) { 
       //here we return the results of the query 
       callback(err, rows); 
      } 
     );  
} 

這是你現在如何調用getDriver功能:

router.get('/', function(req, res, next) { 
    //now you can call the get-driver, passing a callback function 
    getDriver(function (err, driverResult){ 
     //you might want to do something is err is not null...  
     res.render('SQLtest', { 'title': 'SQL test', 
         'result': driverResult}); 

    }); 
}); 

給它一個嘗試,讓我知道它是否有效。 我希望這可以幫助。

+0

非常感謝您的回覆,現在完美地工作!我會用回調函數做更多練習,因爲我從來都不會猜到這是問題所在。 –

+0

太棒了!請接受答案,以便您的問題可以標記爲已回答。如果您覺得有幫助,您也可以爲答案投票。 – ishmaelMakitla

+0

現在應該被接受:) - 我還有另外一個普遍的問題,因爲我在這裏發帖之前花了很長時間沒有找到答案,我總是擔心我沒有以正確的方式工作;我的嵌入式JS文件帶有JSON對象並將其寫入到前端的表中(這是我所有的Web應用程序需要做的)。因此,以這種方式傳遞數據庫查詢是正確的?還是有其他方法我應該使用? –