2017-06-09 70 views
0

我正在研究一个非常简单的Web应用程序,它没有做太多的工作,但是它在一个表上连接到数据库以进行INSERT和SELECT操作。我有一个功能,我浏览了几个伟大的教程时使用,但我无法返回从SELECT查询rows。记住我正在学习Node.JS - 我将如何显示从查询(SELECT)返回到此块的数据?函数的内部函数的返回值node.js/MySQL

app.post("/getcsv", function(req,res){ 

var sqlselall = "SELECT * FROM office"; 
var rows = handle_database(sqlselall); 
res.json(rows); 
res.end(); 

用于处理数据库连接(使用池)的功能:

function handle_database(sqlstmt){ 

pool.getConnection(function(err,connection){ 

    if(err) { 
     res.json({"code" : 100, "status" : "Error in connection to database."}); 
     return; 
    } 

    console.log('connected as id ' + connection.threadId); 

    connection.query(sqlstmt, function(err,rows){ 
     connection.release(); 
     if(!err){ 
      console.log("Number of rows affected: " + rows.affectedRows); 
     } 

    }); 

    connection.on('error', function(err) { 
     res.json({"code": 100, "status" : "Error in connection to database."}); 
     return; 
    }); 

我意识到,在内部功能的rows包含了我所需要的数据,但我在茫然,当我调用函数时如何返回它。

+0

的可能的复制[如何返回从一个异步调用的响应?](https://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-打电话) – Paul

+0

@保罗 - 不幸的是我很难完全掌握JS中回调的概念。 – Smitty

+0

这只是你必须通过一些教程来运行的东西。回调函数只是函数,但是你想要的肉(例如行)只在该函数的范围内。所以你需要确保你所需要的一切都在相同的范围内。 – Paul

回答

0

回答我自己的问题,尤其是考虑到一些人可能认为它是重复的(这是由于我对Node.JS和JS一般的认识不足),似乎不合适,但是我发现一旦我做了一些研究(感谢@保罗 - 和回调地狱),并获得关于函数,回调,匿名函数和Javascript中函数范围性质的一些基础知识的澄清,我能够提出解决我的问题的方法。如果我能

app.post("/getcsv", function(req, res) { 

    var sqlselall = "SELECT * FROM office" 
    var thisData = select_query(sqlselall, res) 
}) 

function select_query(sqlstmt, res) { 

    pool.query(sqlstmt, function(err, results, fields) { 
    if (err) throw err 
    res.send(JSON.stringify(results)) 
    }) 
} 
1

所以:所以我连接到数据库我创建了从app.post通过从回调参数参数“水库”(我现在有所了解)一个新的简化功能评论你回答我会。这是我想补充你的答案,因为它看起来像你的答案应该适用于我,虽然我没有亲自测试过它。

从努力学习回调风格的经验,我认为这可能会帮助你。它确实有助于让代码更加模块化。

app.post("/getcsv", function(req, res) { 
    var sqlselall = "SELECT * FROM office" 
    select_query(sqlselall, function(results){ 
     res.send(results) 
    }) 
}) 

function select_query(sqlstmt, callback) { 
    pool.query(sqlstmt, function(err, results, fields) { 
    //I suppose if this is how you want to handle errors 
    //for debugging purposes I like returning them as well 
    //returning it helps both you and others who might be working on 
    //the front end to know whats happening 
    if (err) throw err 
    callback(JSON.stringify(results)) 
    }) 
} 

这样你select_query功能不需要资源,以获得通过的,并且不依赖于,为了工作,有一个函数的参数。有些时候不能得到帮助,但是当我可以发现维护更容易考虑时。

在假设的情况下,您可能有另一个需要查询的端点,但需要在发送之前附加修改信息,您仍然可以使用select_query函数并修改回调函数你通过它。所以,你最终会是这样的:(我也改变了错误处理略)

​​

就像我说的,我不是说你的方式是错误的,它的工作原理,也许它会工作更好您。我刚刚发现,这帮助我处理了回调,并且开始享受使用它们的乐趣。

+0

谢谢你!您的第一个代码示例实际上有助于将回调主页的概念稍微多一点。因此,您可以传递一个匿名函数作为与您调用的指定函数内的回调函数相对应的参数。从逻辑的角度来看,并不是一个很容易理解的概念,尤其是来自C#。 – Smitty

+0

对,它就像一个不同的范例,但我真的很喜欢它。我很高兴它有帮助。 – Jeff