从函数node.js / MySQL的内部函数返回值

时间:2017-06-09 03:11:13

标签: javascript mysql node.js express

我正在开发一个非常简单的Web应用程序,它不会做太多事情,但是它确实连接到一个表上的INSERT和SELECT操作的数据库。我在浏览几个很棒的教程时使用了一个函数,但是我在从SELECT查询返回rows时遇到了麻烦。请记住我正在学习Node.JS - 如何将查询返回的数据(SELECT)显示到此块?

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包含了我需要的数据,但是当我调用函数时,我不知道如何返回它。

2 个答案:

答案 0 :(得分:2)

所以,如果我能评论你的答案我会的。这是我想补充你的答案,因为看起来你的答案对我有用,虽然我没有亲自测试过。

从尝试学习回调风格的经验来看,我认为这可能会对你有所帮助。它确实有助于使代码更加模块化。

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函数不需要传入res,并且不依赖于具有函数的参数才能工作。有时候无法帮助,但是当我能够更容易地进行维护时将其考虑在内。

在假设的情况下,您可能还有另一个需要查询的终点,但需要在发送之前追加修改信息,您仍然可以使用select_query函数,只需修改您的回调即可你进入它。所以你最终得到这样的东西:(我也改变了一点错误处理)

app.post("/getcsv", function(req, res) {
   var sqlselall = "SELECT * FROM office"
   select_query(sqlselall, function(err, results){
      if(err){
         res.send(err)
         //throw an error if you would like to here 
      }
      res.send(results)
   })
})
app.post("/modifyCSV", function(req, res){
  var sql = "{sql statement}"
   select_query(sql, function(err, results){
     if(err){
         res.send("Aww an error: "+err)
         //throw an error if you would like to here 
     }res.send(reuslts + "\nHello to you too")
   })
})

function select_query(sqlstmt, callback) {
  pool.query(sqlstmt, function(err, results, fields) {
  if (err) 
     callback(JSON.stringify(err), null)
  callback(null, JSON.stringify(results))
  })
}

就像我说的那样,我并不是说你的方式是错的,它有效,也许它对你来说会更好。我刚刚发现这有助于我处理回调,并且实际上开始喜欢使用它们。

答案 1 :(得分:0)

回答我自己的问题,特别是考虑到一些人可能认为它是重复的(由于我对Node.JS和JS一般都缺乏知识),似乎不合适,但是我发现一旦我做了一些研究(感谢@Paul - 和回调地狱)并获得了关于函数,回调,匿名函数以及Javascript中函数范围的本质的一些基本原理的说明我能够找到解决问题的方法。因此,对于我与DB的连接,我创建了一个新的简化函数,该函数传递参数' res'来自app.post的回调参数(我现在有点理解):

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