无法弄清楚如何在 NodeJS 中为 MySQL 执行异步函数

Can't figure out how to do async functions in NodeJS for MySQL

我正在用 JS 编写一些需要使用异步函数的代码,因为我在这里进行了一些搜索,异步似乎是 JS 的最佳选择。 我正在为节点编写一个小脚本,以便在每次通过函数传递变量时触发查找。如果变量在数据库中,它应该 return 作为变量,否则变量将保持未设置状态。我觉得我缺乏对回调和异步的理解。谁能指出我可能做错了什么的正确方向。

var mysql = require('mysql');
const util = require('util');
var connection;
const dbConfig = {
  host     : 'localhost',
  user     : 'uname',
  password : 'password',
  database : 'users'
};

async function check_name(check_fname) {
    let connection;
    try {
        connection = await mysql.createConnection(dbConfig);
        const result = await connection.query('SELECT fname from users WHERE fname LIKE ' + mysql.escape(check_fname), function (error, results, fields) { 
        
        if(results.length > 0){
        return await check_fname;
}
}

for (const element of names) {
    const fname = check_name(element);
}

console.log(fname);  <--- Shows Undefined

使用这个-

return check_fname;

而不是

return await check_fname;

此外,像这样更改上面的迭代-

let names = []
let fname = [];
for (let element of names) {
    fname.push(check_name(element));
}
console.log(fname)

希望有用

您在循环范围内定义 fname,然后在其范围外引用它,使其未定义。尝试将 console.log(fname); 放在 for-loop.

最重要的是,您不是在等待 check_name 函数。

const express = require('express');
const app = express();
const mysql = require('mysql2'); // async/await works only in mysql2, also you need to use mysql2 as dependency (npm i mysql2)

app.use(express.json())

mysql.createConnection({
  host     : 'localhost',
  user     : 'uname',
  password : 'password',
  database : 'users'
}); //keeps always connected to the db

app.get('/user/:name', async (req, res) => {
   const name = req.params.name;
   const user = await mysql.query(`select fname from users where fname = ${name}`);
   console.log(user); 
});

app.listen(3000, () => console.log('Server started listening on port 3000');

我的建议:

  1. 给函数和变量起有意义的名字;
  2. 学习使用 ORM(我最喜欢的 Objectionjs + Knexjs)从数据库连接和检索数据;