[英]node.js async using SQL
我需要在我的代码(包括具有相同问题的其他查询)的 rest 执行之前从查询中获取结果。 现在我有一个建立 sql 连接的文件,如下所示:
const mysql = require("mysql");
const config = require("./configuration/config.json");
var conn = mysql.createConnection ( {
host: config.host,
user: config.user,
password: config.password,
database: config.database
});
module.exports = conn;
然后我的 API 代码获取检索工作 session 的信息如下所示:
const bodyParser = require("body-parser");
const router = require("express").Router();
const conn = require("../mysqldb");
router.get("/", async (req, res) => {
console.log(`GET class report called for: project = ${req.query.project} and week of ${req.query.date}`);
var date = req.query.date;
var proj = req.query.project;
var theReport = [];
//Might not need date info
var weekStart = new Date(date);
var weekInMilliseconds = 7 * 24 * 60 * 60 * 1000;
var weekEnd = new Date();
weekEnd.setTime(weekStart.getTime() + weekInMilliseconds);
const getProjectReport = async (proj, start, end) => {
console.log(`getProject called for project ${proj} within date ${date} & ${weekEnd}`);
var uids = [];
// Find the sessions given the date and the project code
let sql = "select uid from user;"
conn.query(sql, (err, rows) => {
if (err) {
return res.status(500).json({ error: err });
}
else {
for (let l = 0; l < rows.length; l++) {
uids.push(rows[l]);
}
}
});
let qry = "SELECT * FROM work_session WHERE date BETWEEN (DATE('" + date + "')) AND (DATE('" + date + "') + 6) AND project = '" + proj + "';"
conn.query(qry, (err, rows) => {
if (err) {
return res.status(500).json({ error: err });
}
else {
//for all users in DB
for (let u = 0; u < uids.length; u++) {
let timeWorked = 0.0;
let sessions = [];
//for all work sessions
for (let w = 0; w < rows.length; w++) {
if (uids[u].uid == rows[w].uid) {
timeWorked = timeWorked + hoursWrked(rows[w].starthr, rows[w].startmin, rows[w].finishhr, rows[w].finishmin);
sessions.push(rows[w]);
}
}
//If there was time works (AKA if a user with data was found and info recorded)
if (timeWorked > 0) {
// Query for user information
let qry = "select * from user where uid = " + uids[u].uid + ";"
conn.query(qry, (err, rows) => {
if (err) {
return res.status(500).json({ error: err });
}
else {
var jsonString = { email: rows[0].email, hours: timeWorked, lname: rows[0].lname, fname: rows[0].fname, sessiontimes: sessions, weekS: req.query.date, weekE: weekEnd };
theReport.push(jsonString);
}
});
}
}
}
});
//return the report
return theReport;
}
function hoursWrked(startHr, startMin, finishHr, finishMin) {
let hours = finishHr - startHr;
let minutes = finishMin - startMin;
if (hours < 0) {
hours = hours + 24;
}
if (minutes < 0) {
minutes = minutes + 60;
hours = hours - 1;
}
let time = hours + minutes / 60;
totalTime = Math.round(100 * time) / 100;
return totalTime;
}
var theReport = await getProjectReport(proj, weekStart, weekEnd);
console.log(theReport);
if (theReport[0]) {
console.log("Got it");
return res.status(200).send(theReport);
}
else {
console.log("darn");
return res.status(400).send({ msg: "No projects/users found." });
}
});
module.exports = router;
我相信如果它全部异步运行,这应该可以工作,问题是它没有,并且在查询完成运行之前它运行了一半。 任何和所有的帮助将不胜感激!
您的 await 调用仅适用于被视为异步的 function 的 scope 内部。 都调用 getProjectReport 异步,然后
var theReport = await getProjectReport(proj, weekStart, weekEnd);
不会按预期工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.