2016-12-03 113 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应用程序需要做的)。因此,以这种方式传递数据库查询是正确的?还是有其他方法我应该使用? –