为什么我的异步函数在使用 MySQL2 时返回 undefined?



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

这是我的配置.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);
}

我正在尝试获取列的名称,以便我可以对后端使用 datatable 的过滤,因为节点是异步的,这个查询正在执行,但值未定义(现在仍然是(,我已经阅读了数百篇关于承诺、蓝鸟和异步方法的帖子,并试图做到这一点,最后我读了很多最好的,我选择了它,因为代码看起来更干净。知道发生了什么吗?

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

但是,我们可以做出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);
}
}

让我知道它是否适合您。

相关内容

  • 没有找到相关文章

最新更新