无法弄清楚如何在 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');
我的建议:
- 给函数和变量起有意义的名字;
- 学习使用 ORM(我最喜欢的 Objectionjs + Knexjs)从数据库连接和检索数据;
我正在用 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');
我的建议:
- 给函数和变量起有意义的名字;
- 学习使用 ORM(我最喜欢的 Objectionjs + Knexjs)从数据库连接和检索数据;