Javascript 要作为json对象返回的多个db查询。更干净的方法?

Javascript 要作为json对象返回的多个db查询。更干净的方法?,javascript,database,express,mariadb,Javascript,Database,Express,Mariadb,所以。。。这是我正在使用的代码。我想知道有没有更干净的方法。因为代码会堆积如山,看起来就像一个凌乱的代码块。我是mariah db+express app.get ("/ordersInfo", function (req, res) { connection.query("SELECT SUM(`subtotal`) as data FROM `orders` WHERE created_at BETWEEN '" + moment().startO

所以。。。这是我正在使用的代码。我想知道有没有更干净的方法。因为代码会堆积如山,看起来就像一个凌乱的代码块。我是mariah db+express

app.get

("/ordersInfo", function (req, res) {
  connection.query("SELECT SUM(`subtotal`) as data FROM `orders` WHERE created_at BETWEEN '" + moment().startOf("day").format() + "' AND '" + moment().endOf("day").format() + "'", (err, dailyTotalRevenue) => {
    connection.query("SELECT SUM(`subtotal`) as data FROM `orders` WHERE created_at BETWEEN '" + moment().startOf("week").format() + "' AND '" + moment().endOf("week").format() + "'", (err, weeklyTotalRevenue) => {
      connection.query("SELECT SUM(`subtotal`) as data FROM `orders` WHERE created_at BETWEEN '" + moment().startOf("month").format() + "' AND '" + moment().endOf("month").format() + "'", (err, monthlyTotalRevenue) => {
        connection.query("SELECT COUNT(*) as data FROM `orders` WHERE created_at BETWEEN '" + moment().startOf("day").format() + "' AND '" + moment().endOf("day").format() + "'", (err, dailyTotalOrderCount) => {
          connection.query("SELECT COUNT(*) as data FROM `orders` WHERE created_at BETWEEN '" + moment().startOf("week").format() + "' AND '" + moment().endOf("week").format() + "'", (err, weeklyTotalOrderCount) => {
            connection.query("SELECT COUNT(*) as data FROM `orders` WHERE created_at BETWEEN '" + moment().startOf("month").format() + "' AND '" + moment().endOf("month").format() + "'", (err, monthlyTotalOrderCount) => {
              connection.query("SELECT * FROM `orders` WHERE created_at BETWEEN '" + moment().startOf("month").format() + "' AND '" + moment().endOf("month").format() + "'", (err, month) => {
                connection.query("SELECT COUNT(*) as data FROM `orders` WHERE status = 'pending'", (err, totalPending) => {
                  connection.query("SELECT COUNT(*) as data FROM `orders` WHERE status = 'ready_to_ship'", (err, totalReadyToShip) => {
                    if (err) {
                      console.log(err);
                      res.json({ error: true });
                    } else {
                      return res.json({
                        daily: {
                          totalRevenue: (dailyTotalRevenue[0].data) ? dailyTotalRevenue[0].data : 0,
                          totalOrderCount: (dailyTotalOrderCount[0].data) ? dailyTotalOrderCount[0].data : 0,
                        },
                        weekly: {
                          totalRevenue: (weeklyTotalRevenue[0].data) ? weeklyTotalRevenue[0].data : 0,
                          totalOrderCount: (weeklyTotalOrderCount[0].data) ? weeklyTotalOrderCount[0].data : 0,
                        },
                        monthly: {
                          totalRevenue: (monthlyTotalRevenue[0].data) ? monthlyTotalRevenue[0].data : 0,
                          totalOrderCount: (monthlyTotalOrderCount[0].data) ? monthlyTotalOrderCount[0].data : 0,
                        },
                        total: {
                          totalPending: totalPending[0].data,
                          totalReadyToShip: totalReadyToShip[0].data,
                        }
                      });
                    }
                  });
                });
              });
            });
          });
        });
      });
    });
  });
});
结果如下所示:

QueryDB(qs1).then(data => QueryDB(qs2)).then(data => QueryDB(qs3))./*more chaining*/.catch(err => console.log(err))


它完成了任务,但我需要从数据库的一个表中检索更多的信息。有更干净和/或更有效的方法吗?

您可以使用承诺链将其编写得更干净、更具可读性。其sudo代码如下所示:

QueryDB(qs1).then(data => QueryDB(qs2)).then(data => QueryDB(qs3))./*more chaining*/.catch(err => console.log(err))

查询数据库的通用函数:

function QueryDB(queryString) {
  return new Promise((resolve, reject) => {
    connection.query(queryString, (err, data) => {
      if (err) reject(err.message);
      resolve(data);
    });
  });
}
然后你可以像这样把它链起来:

QueryDB(qs1).then(data => QueryDB(qs2)).then(data => QueryDB(qs3))./*more chaining*/.catch(err => console.log(err))


可以将单独的查询重构为一个:

选择sum(日期(创建时间)=CURDATE()然后小计结束)作为dailyTotalRevenue,
求和(当YEARWEEK(创建时间为,1)=YEARWEEK(CURDATE(),1)然后小计结束时的情况)作为weeklyTotalRevenue,
计数(状态为'pending'然后为1 end时的情况)为pendingCount,
计数(状态为“准备装运”时为1结束)为readyToShipCount
从命令
下表列出了数据:

结果(今天是2021-02-14):

更多信息:


请记住,一个额外的参数(
1
)已传递到,用于将星期一标记为一周的开始日期。

我对maria/MySQL了解不多,但在Postgresql中,我会在单个查询中这样做,其中每个
SUM()
都是
SELECT
子句中的
CASE
表达式。这样你就可以得到一行你需要的所有值。