簡體   English   中英

如何使用Mysql和node.js進行同步數據庫查詢?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM