Node.js 在继续之前等待 ("await") SQL 数据库查询

Node.js wait("await") for SQL database query before proceeding

我花了很多时间阅读这个,但我根本不知道如何解决它。

我有一个应用程序使用存储在 SQL 数据库中的令牌。我需要该令牌才能继续申请。

我试图用“await”来解决它,但它不起作用。 SQL 查询结果仍然“来不及”检索。

const pool = mysql.createPool({
    user        : 'xxxx', // e.g. 'my-db-user'
    password    : "xxxx", // e.g. 'my-db-password'
    database    : "xxxx", // e.g. 'my-database'
    // If connecting via localhost, specify the ip
    host        : "xxxx"
    // If connecting via unix domain socket, specify the path
    //socketPath  : `/cloudsql/xxxx`,
});   

const isAuthorized = async (userId) => {
    
      let  query = "SELECT * FROM auth WHERE id = 2";
    
      
      await pool.query(query, (error,results) => {
        if (!results[0]) {
           console.log("No results");
           return
          } else {
            tokenyay=results[0].refreshtoken;
            console.log("results: "+results[0].refreshtoken);
            return results[0].refreshtoken;
            
          }
        });
      
    
      await console.log("tokenyay: "+tokenyay);
      
      if (tokenyay != null && tokenyay != '') {
      refreshTokenStore[userId] = tokenyay;
      }
    
      console.log(userId);
      console.log(refreshTokenStore[userId] ? true : false);
    
      return refreshTokenStore[userId] ? true : false;
    };

我不知道你的pool是什么,但是从回调来看,我们可以看到pool.query()方法不是await-able。

不过,您可以为其手动创建一个 Promise,它是 await-able,例如

await new Promise((resolve, reject) => {
    pool.query(query, (error, results) => {
        if (error) reject(error);

        if (!results[0]) {
            console.log("No results");
            resolve(); // give `undefined` to the `await...` and make it stop waiting
            return;
        } else {
            tokenyay = results[0].refreshtoken;
            console.log("results: " + results[0].refreshtoken);
            resolve(results[0].refreshtoken);
        }

    })
});

编辑:

然而,由于 await 的结果是从传递给 resolve 的值中获得的,我们不需要在回调内部分配 tokenyay。 我们可以使用 tokenyay = await... 代替。

tokenyay = await new Promise((resolve, reject) => {
    pool.query(query, (error, results) => {
        if (error) reject(error);

        if (!results[0]) {
            console.log("No results");
            resolve(); // give `undefined` to the `await...` and make it stop waiting
            return;
        } else {
            console.log("results: " + results[0].refreshtoken);
            resolve(results[0].refreshtoken);
        }

    })
});