【问题标题】:Return value from inner function of a function node.js / MySQL从函数node.js / MySQL的内部函数返回值
【发布时间】:2017-06-09 03:11:12
【问题描述】:

我正在开发一个非常简单的 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 包含我需要的数据,但是当我调用该函数时,我不知道如何返回它。

【问题讨论】:

  • @Paul - 不幸的是,我无法完全掌握 JS 中回调的概念。
  • 这只是你必须通过一些教程运行的东西。回调只是函数,但您想要的内容(例如行)仅在该函数的 inside 范围内。因此,您需要确保您需要使用的所有内容都在同一范围内可用。
  • @Paul 好的——这就是我现在正在做的事情——阅读回调。我认为范围与它有很大关系。
  • 是的,这并不难,这只是一个认知上的飞跃,你只有在用头撞一两次后才能实现。 :) 你了解它之后,看看 asyncjs 库,以便更轻松地进行流控制和 Promise(特别是如果你愿意使用最新版本的 Node,它将 async/await 带到桌面上)

标签: javascript mysql node.js express


【解决方案1】:

因此,如果我可以对您的答案发表评论,我会的。这是我想对您的答案进行补充的内容,因为您的答案看起来应该对我有用,尽管我没有亲自测试过。

根据尝试学习回调样式的经验,我认为这可能会对您有所帮助。它确实有助于使代码更加模块化。

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

就像我说的,我并不是说你的方法是错误的,它有效,也许它对你会更好。我刚刚发现这有助于我处理回调,并真正开始享受使用它们。

【讨论】:

  • 谢谢!您的第一个代码示例实际上帮助带回了回调的概念。因此,您可以将匿名函数作为参数传递给您正在调用的命名函数中的回调函数。从逻辑的角度来看,这不是一个容易快速掌握的概念——尤其是来自 C#。
  • 对,这有点像另一种范式,但我真的很喜欢。我很高兴它有所帮助。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2011-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-10
    • 2022-11-11
    • 2020-09-12
    相关资源
    最近更新 更多