[英]How to make a sync database query with Mysql and node.js?
我正在尝试使用mysql nodejs模块在数据库中进行SELECT查询。 问题是connection.query
函数是一个异步函数,因此我将其放在这样的promise中:
function execQuery(query, fields){
const connection = mysql.createConnection({
host: process.env.DB_HOST,
port: process.env.DB_PORT,
user: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: process.env.DB_DATABASE,
});
return new Promise((resolve, reject) => {
connection.query(query, fields, (err, results) => {
connection.end();
if (err){
return reject(err);
}else{
return resolve(results);
}
}
)
此函数由另一个函数调用:
function getPasswordFromUser(username){
query = 'SELECT password FROM User WHERE username=?'
parameters = [username]
execQuery(query, parameters)
.then(result => {
if (result !== undefined && result.length === 1){
console.log('here1')
return result
}
})
.catch(err => console.log(err))
console.log('here2')
}
问题是,尽管我返回了诺言并使用then
,但在我的控制台中仍然收到:
here2
here1
因此我的查询一直以异步模式运行,而我无法获得结果。
使用诺言做到这一点的最佳方法是什么?
只是您没有兑现承诺,仅此而已。
这样做: return execQuery(query, parameters)
您可以像一个简单的承诺一样使用它。
getPasswordFromUser('userid')
.then((result)=>{
..do stuff..
});
或者,如果您使用的是async-await
使用异步函数并等待getPasswordFromUser
函数。 例如快速路线。
app.post('/getPassword', async (req,res) =>{
const userID = req.body.userID;
const password = await getPasswordFromUser(userID);
res.send(password);
});
注意:这是一个玩笑,我希望您不要以纯文本形式存储密码,如果要与密码匹配(例如登录名),则应执行以下操作: select count(*) from user where username=username and password=hash(password);
或者您正在使用bcrypt
或其他方式匹配密码。
您首先看到here2
因为它不在then
。 启动execQuery
函数后,程序将继续执行。
您可以返回承诺:
function getPasswordFromUser(username){
query = 'SELECT password FROM User WHERE username=?'
parameters = [username]
return execQuery(query, parameters)
.then(result => {
if (result !== undefined && result.length === 1){
console.log('here1')
return result
}
})
.catch(err => console.log(err))
}
然后将.then(result => { ... })
到函数调用中以获取结果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.