Javascript 如何使用Mysql和node.js进行同步数据库查询?
我正在尝试使用mysql nodejs模块在数据库中进行SELECT查询。问题在于,Javascript 如何使用Mysql和node.js进行同步数据库查询?,javascript,node.js,es6-promise,Javascript,Node.js,Es6 Promise,我正在尝试使用mysql nodejs模块在数据库中进行SELECT查询。问题在于,connection.query函数是一个异步函数,因此我将其放在如下承诺中: function execQuery(query, fields){ const connection = mysql.createConnection({ host: process.env.DB_HOST, port: process.env.DB_PORT, user: p
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')
}
问题是,尽管我返回了一个承诺并使用然后
,但在我的控制台中,我收到:
此处2
此处1
所以我的查询一直在异步模式下运行,无法得到结果
使用promise实现这一点的最佳方法是什么?您首先看到这里的
2
,因为它不在中,然后是。程序在启动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=>{…})
添加到函数调用中以获得结果。只是您没有返回承诺,就是这样
做:
返回execQuery(查询,参数)
你把它当作一个简单的承诺
getPasswordFromUser('userid')
.then((result)=>{
..do stuff..
});
或者,如果您正在使用async wait
则使用异步函数并等待getPasswordFromUser
函数。例如,对于快速路线
app.post('/getPassword', async (req,res) =>{
const userID = req.body.userID;
const password = await getPasswordFromUser(userID);
res.send(password);
});
注意:这条路线是一个笑话,我希望你不是以明文形式存储密码,如果你想匹配密码(比如登录),你应该这样做:select count(*)from user,其中username=username,password=hash(password)
或者您正在使用bcrypt
或其他方法匹配密码 如果您这样做是正确的,那么我要做的额外工作是返回execQuery(..
以便调用getPasswordFromUser的任何人(
也可以附加到承诺链。承诺仍然是异步的,使用承诺不会使任何事情同步。如果您希望此处2
稍后出现,则需要将其放入中,然后
回调。getPasswordFromUser
也需要返回承诺。我尝试了此解决方案,但现在在调用getPasswordFromUser()的函数我收到一个承诺。我只想返回查询的结果获取该值的唯一方法是添加一个。然后(result=>{…})
到getPasswordFromUser
函数调用。这正是Promissions/async的工作方式。因此我不能在“.then”语句之外使用结果。如果我想在另一个函数中使用此结果怎么办?我必须在“.then”中调用函数吗?如果我需要多次处理此变量,这可能是一个可怕的代码。这是异步函数工作,如果你想使用一个异步函数,你需要异步构造所有代码。但这就是为什么有async wait
。它给你的印象是这是同步的,但在幕后它使函数异步。如果你想多次处理变量,只需存储它在局部变量中。