我在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');
我的建议:
- 为函数和变量指定有意义的名称
- 学习使用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)
希望它能在上运行