首页 > 解决方案 > 为什么我的异步函数在使用 mysql2 时返回 undefine?

问题描述

我一直在不停地尝试为我的数据表前端处理这个查询。

这是我的 config.js

var config = {

host : 'localhost',
user : 'root',
password : '',
database : 'ef45db'
 }

module.exports = config;

这是我想使用异步的函数(等待查询返回表的列名)

async function getColumnNames()
            {

        try{

             aColumns = [];
            await connection.query('SHOW COLUMNS FROM '+sTable,
                 function selectCb(err, results, fields){

                    console.log("entro a getColumnNames");

                  if(err){
                    console.log(err);
                  }
                  for(var i in results)
                  {
                    aColumns.push(results[i]['Field']);
                  }

                  connection.end();
                });


                }catch (e){
                    console.log(e);
                }
            }

这是执行该功能的控制器代码:

var mysql = require('mysql2');

var config = require('.././database/config');
var connection = mysql.createConnection(config);
var sIndexColumn = '*';
var sTable = 'users';
var aColumns = [];

 module.exports = {

    getInfo : async function(req,res,next)
            {
                var request = req.query;

                (async () => await  getColumnNames());

                console.log(aColumns);

            }

我正在尝试获取列的名称,以便我可以使用数据表的后端过滤,因为节点是异步的,这个查询正在执行,但值是未定义的(仍然是),我已经阅读了数百篇关于承诺的帖子, bluebird 和 async 方法并试图使其工作,最后我读了很多那是最好的,我选择它是因为代码看起来更干净。任何想法发生了什么?

标签: node.jsexpressasynchronousmysql2

解决方案


对于getColumnNames(),您不应该使用await,因为connection.query不会返回承诺。它是一个回调函数。

但是,我们可以做出getColumnNames回报承诺。

function getColumnNames() {
  const aColumns = [];

  return new Promise((resolve, reject) => {
    connection.query('SHOW COLUMNS FROM ' + sTable,
      function selectCb(err, results, fields) {

        console.log("entro a getColumnNames");

        if (err) {
          console.log(err);
          reject(err); // if error happens, reject
        }

        for (var i in results) {
          aColumns.push(results[i]['Field']);
        }

        connection.end();

        resolve(aColumns); // resolve with our database columns
      });
  });
}

对于您的控制器,我们可以使用async await因为getColumnNames返回承诺,如

module.exports = {
  getInfo: async function (req, res, next) {
    var request = req.query;

    const aColumns = await getColumnNames();

    console.log(aColumns);

  }
}

请让我知道这对你有没有用。


推荐阅读