javascript - 如何使用 Mysql 和 node.js 进行同步数据库查询?
问题描述
我正在尝试使用 mysql nodejs 模块在我的数据库中进行 SELECT 查询。问题是该connection.query
函数是一个异步函数,所以我把它放在一个这样的承诺中:
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')
}
问题是,尽管我返回了一个 promise 和 use then
,但在我的控制台中我收到:
here2
here1
所以我的查询一直在异步模式下运行,我无法得到结果。
使用 Promise 做到这一点的最佳方法是什么?
解决方案
只是你没有兑现承诺,仅此而已。
做:
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
或其他方式匹配密码。
推荐阅读
- docker - 当我 dockerize 我的 Go 应用程序时,它没有看到 HTML 模板
- android - Google Fit 中的 updateData() 与 insertData()
- javascript - Javascript如何从前置元素中查找所选文本的行号
- docker - 如何向现有的 Docker/Singularity 映像添加额外的命令行工具?
- c# - 从 WebClient 获取响应标头
- sql-server - 如何在 DevOps 构建管道中使用 EF6.exe 生成带有触发器的脚本
- arrays - 尝试添加“平均”和“备注”,无法完成逻辑
- r - 在 ggplot2 中创建多个重叠密度图
- php - 如何通过 mpdf 将生成的 PDF 插入数据库?
- swift - 带有 NavigationLink 的按钮和函数调用 SwiftUI