首页 > 解决方案 > 如何使用 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 做到这一点的最佳方法是什么?

标签: javascriptnode.jses6-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或其他方式匹配密码。


推荐阅读