mysql - Node.js express 和 mySQL 数据

标签 mysql node.js

我刚开始学习 JavaScript 和 Node.JS,我真的很难理解回调的概念。所以我继续尝试实现它们以将 mySQL 数据推送到站点。

我是这样开始的:

// connection stuff happened already. Connection works fine.

app.get('/home', function(req,res){

var sql = `select u.* from users u`;

var sql2 = `select u.* from users2 u`;

usersA = [];
usersB = [];
connection.query(sql, function(error, results, fields){
    if (error) throw error;
    results.forEach(function(user){
        usersA.push({
            "id":user.id,
            "name":user.name,
            "lastname":user.lastname
        });
    });
    connection.query(sql2, function(error, results, fields){
      if (error) throw error;
      results.forEach(function(user){
        usersB.push({
            "id":user.id,
            "name":user.name,
            "lastname":user.lastname
        });
      });
      res.render("index", {
        usersA: usersA,
        usersB: usersB
      });
    });
  });
});

这行得通。但我觉得这是错误的方法,因为可能有超过 2 个查询。

我需要在呈现索引之前填充两个数组。而且我想更直接地实现这一点,而无需在彼此之间嵌套多个查询。

也许我只是不习惯那样编写代码。如果即使对于 10 个或更多查询这也是一种有效的方法,我也会坚持使用它。就是感觉不对。

所以我开始研究 this SO thread并试图以某种方式让事情正常进行,但没有成功:

function executeQuery(query, callback) {
  connection.query(query, function (err, rows, fields) {
    if (err) {
      return callback(err, null);
    } else {
      return callback(null, rows);
    }
  })
}

function getResult(query,callback) {
  executeQuery(query, function (err, rows) {
    if (!err) {
      callback(null,rows);
    } else {
      callback(true,err);
    }
  });
}

function getUsers(sqlQry){
  getResult(sqlQry,function(err,rows){
    if(!err){
      return rows;
    } else {
      console.log(err);
    }
  });
}

准备好后,我尝试了以下操作:

var sql = `select u.* from users u`;
var sql2 = `select u.* from users2 u`;

app.get('/home', function(req,res){
  res.render("index", {
    usersA: getUsers(sql),
    usersB: getUsers(sql2)
  });
}

但是我的 usersA/usersB 是空的。我猜这是某种作用域/异步问题,因为 getUsers() 在执行查询之前返回。

据我目前所读的内容来看,这可能是 promises 的好地方。

我在我的解决方案中添加了一个答案。

最佳答案

我找到了问题的答案

我找到了 this article关于使用 promises 的 Node.js 和 mySQL 的 codeburst,并尝试了它。所以所有的功劳都归功于他们。

app.get('/home', function(req,res){
  var db = new Database({
    host     : "someHost.someDomain",
    user     : "someUser",
    password : "somePassword",
    database : "someDatabase"
  });

var sql = `select u.* from users u`;
var sql2 = `select u.* from users2 u`;

usersA = [];
usersB = [];

db.query(sql)
    .then(rows => {
                rows.forEach(function(user){
                    usersA.push({
                        "id":user.id,
                        "name":user.name,
                        "lastname":user.lastname
                    });
                });
            return db.query(sql2)
        })
    .then(rows => {
                rows.forEach(function(user){
                    usersB.push({
                        "id":user.id,
                        "name":user.name,
                        "lastname":user.lastname
                    });
                });
                return db.close();
        }, err => {
    return db.close().then( () => { throw err; } )
    })
    .then( () => {
        res.render("index", {
            usersA: usersA,
            usersB: usersB
        });
    }).catch( err => {
        console.log(err);   
} )

真的还不明白它是如何工作的,但我会读一读。这允许使用 promise 处理多个嵌套查询,这比简单地嵌套所有内容更容易处理。

如果有人有其他方法或觉得有必要解释这里发生的事情,我将非常感激!

为了在不访问 URL 的情况下完成这里提到的数据库类:

class Database {
  constructor( config ) {
    this.connection = mysql.createConnection( config );
  }
  query( sql, args ) {
    return new Promise( ( resolve, reject ) => {
        this.connection.query( sql, args, ( err, rows ) => {
            if ( err )
                return reject( err );
            resolve( rows );
        } );
    } );
  }
  close() {
    return new Promise( ( resolve, reject ) => {
        this.connection.end( err => {
            if ( err )
                return reject( err );
            resolve();
        } );
    } );
  }
}

关于mysql - Node.js express 和 mySQL 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49053681/

相关文章:

mysql - 如何返回表中与 MySQL 中另一列共享相同值的重复项?

mysql_fetch_row 和 ORDER BY - 我做错了什么?

javascript - 如何在 Angular JS 中单击 Node 时多次调用指令?

node.js - Visual Studio Code 调试器不会在 SAM Local 中的断点处停止

javascript - 将数组从 Node 服务器发送到js脚本

node.js - 永远从nodejs服务器开始

javascript - mocha + mongodb 等待异步结果

php - 为什么我不能在 codeigniter 连接查询中使用括号

javascript - 在php中使用ajax向mysql数据库中插入数据

mysql - 列中每个重复项的递增计数器