MySQL串行执行Node.js

时间:2019-02-26 13:31:11

标签: node.js mysqljs

  

mysqldb.js

const mysqlDatabasePool = mysql.createPool({
    connectionLimit: 50,
    host: process.env.MYSQL_HOST,
    user: process.env.MYSQL_USERNAME,
    password: process.env.MYSQL_PASSWORD,
    port: process.env.MYSQL_PORT,
    database: process.env.MYSQL_DATABASE
});

mysqlDatabasePool.getConnection({
  //Basic sanity checking code here
});

mysqlDatabasePool.query = util.promisify(mysqlDatabasePool.query);

module.exports = mysqlDatabasePool;
  

employeeController.js

var pool = require("mysqldb");

pool.query("SELECT CategoryID, CategoryIcon FROM Categories WHERE CategoryName = ?", [categoryName], function(error, results, fields) {
    if(results !== null && results.length > 0) {

        for(var i = 0; i < results.length; i++) {
             outputData[i] = results[i];

             var subCategories = pool.query("SELECT SubcategoryID FROM Subcategories WHERE CategoryID = ?", [results[i].CategoryID], function(error, results, fields) {
                 return results;
             });

             if(subCategories.length > 0) 
                  outputData[i]["Subcategories"] = subCategories;
             else
                  outputData[i]["Subcategories"] = null;
        }
    }
});

outputData[i]["Subcategories"]的内容始终为null,因为它始终可用,因此应该具有子类别的集合。我尝试通过在第二个await/async之前放置await并使第一个pool.query关闭函数异步来实现pool.query

应如何处理?

1 个答案:

答案 0 :(得分:0)

作为参数传递给pool.query的函数是一个回调。这意味着您不知道何时执行。

您可以使用async / await阻止呼叫,直到pool.query给您结果为止。

您可能需要在util.promisify上使用pool.query才能返回Promise。

try {
   const results = await pool.query("SELECT CategoryID, CategoryIcon FROM Categories WHERE CategoryName = ?", [categoryName]);
   if(results !== null && results.length > 0) {

        for(var i = 0; i < results.length; i++) {
             outputData[i] = results[i];

             const subCategories = await pool.query("SELECT SubcategoryID FROM Subcategories WHERE CategoryID = ?", [results[i].CategoryID]);

             if(subCategories.length > 0) 
                  outputData[i]["Subcategories"] = subCategories;
             else
                  outputData[i]["Subcategories"] = null;
        }
    }
} catch(error) {
  console.log(error)
  // Deal with the error
}

上面是如何使用async/await语法的示例。记住要使用关键字await,周围的功能必须标记为async