无法弄清楚如何在 MySQL 的 NodeJS 中执行异步功能



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

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
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(连接和检索数据库中的数据

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

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

使用此-

return check_fname;

而不是

return await check_fname;

同样,改变你上面的迭代,像这样-

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

希望它能在上运行

最新更新