如何使用 Mysql 和 node.js 进行同步数据库查询?
How to make a sync database query with Mysql and 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')
}
问题是,尽管我 return 承诺并使用 then
,但在我的控制台中我收到:
here2
here1
所以我的查询使 运行 处于异步模式,我无法获得结果。
使用 promise 执行此操作的最佳方法是什么?
您首先看到 here2
,因为它不在 then
内。程序在启动execQuery
函数后继续执行。
你可以return一个承诺:
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 => { ... })
得到结果。
只是你没有返回承诺,仅此而已。
做:
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
或其他方式匹配密码。
我正在尝试使用 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')
}
问题是,尽管我 return 承诺并使用 then
,但在我的控制台中我收到:
here2
here1
所以我的查询使 运行 处于异步模式,我无法获得结果。
使用 promise 执行此操作的最佳方法是什么?
您首先看到 here2
,因为它不在 then
内。程序在启动execQuery
函数后继续执行。
你可以return一个承诺:
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 => { ... })
得到结果。
只是你没有返回承诺,仅此而已。
做:
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
或其他方式匹配密码。