Javascript 要作为json对象返回的多个db查询。更干净的方法?
所以。。。这是我正在使用的代码。我想知道有没有更干净的方法。因为代码会堆积如山,看起来就像一个凌乱的代码块。我是mariah db+express app.getJavascript 要作为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
("/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
表达式。这样你就可以得到一行你需要的所有值。