从另一个js脚本调用方法时如何处理node-mysql上的数据库延迟
How to handle database delay on node-mysql when calling method from another js script
我正在为课程做一个示例 API 使用路由和控制器(以 mysql 作为后端),但我的方法之一没有按预期工作,但我不确定为什么...到目前为止,这是我的代码。
这是routes/courses.js(当我转到localhost/courses,应用程序调用这个):
var express = require("express");
var router = express.Router();
var coursesController = require("../controller/courses");
/* GET courses listing. */
router.get("/", function (req, res, next) {
res.json(coursesController.getAllCourses()).status(200).end();
});
module.exports = router;
这是我的 controller/courses.js
const mysqlPool = require("../db/database");
var Courses = {
getAllCourses: () => {
var sql = "select * from courses";
var res = null;
mysqlPool.getConnection((err, conn) => {
if (err) throw err;
try {
conn.query(sql, (error, results) => {
res = results;
console.log(error);
console.log(results);
console.log("returning res = "+res)
return res;
});
} catch (error) {
throw error;
}
});
console.log("not returned anything")
},
getSomeCourses: () => {},
};
module.exports = Courses;
我不确定为什么这不能按预期工作。数据库连接工作正常,它得到了结果,但是当我尝试将它们放在 json 中时,我只有一个空白屏幕。这是我想念的东西吗?也许一些异步功能或类似的东西?
这些是 console.log 结果:
mycourses:server Listening on port 3000 +0ms
not returned anything
GET /courses 200 14.548 ms - -
null
[
RowDataPacket {
idcourse: 1,
name: 'Whatever 101',
description: 'A course about nothing',
thumbnail: null,
price: 10.99
},
RowDataPacket {
idcourse: 2,
name: 'Anything 101',
description: 'Course about idk',
thumbnail: null,
price: 9.99
}
]
returning res = [object Object],[object Object]
您肯定需要将 getAllCourses
转换为异步函数(使用 new Promise
),然后在路由处理程序中像这样更改您的代码:
router.get("/", function (req, res, next) {
coursesController.getAllCourses().then(courses => {
res.json(courses); // there is no need to use status(200) and res.end if you use res.json
});
});
不要忘记为所有路由添加错误处理程序或在 then
之后添加 catch
调用以在从 DB
获取课程时处理错误
我正在为课程做一个示例 API 使用路由和控制器(以 mysql 作为后端),但我的方法之一没有按预期工作,但我不确定为什么...到目前为止,这是我的代码。
这是routes/courses.js(当我转到localhost/courses,应用程序调用这个):
var express = require("express");
var router = express.Router();
var coursesController = require("../controller/courses");
/* GET courses listing. */
router.get("/", function (req, res, next) {
res.json(coursesController.getAllCourses()).status(200).end();
});
module.exports = router;
这是我的 controller/courses.js
const mysqlPool = require("../db/database");
var Courses = {
getAllCourses: () => {
var sql = "select * from courses";
var res = null;
mysqlPool.getConnection((err, conn) => {
if (err) throw err;
try {
conn.query(sql, (error, results) => {
res = results;
console.log(error);
console.log(results);
console.log("returning res = "+res)
return res;
});
} catch (error) {
throw error;
}
});
console.log("not returned anything")
},
getSomeCourses: () => {},
};
module.exports = Courses;
我不确定为什么这不能按预期工作。数据库连接工作正常,它得到了结果,但是当我尝试将它们放在 json 中时,我只有一个空白屏幕。这是我想念的东西吗?也许一些异步功能或类似的东西?
这些是 console.log 结果:
mycourses:server Listening on port 3000 +0ms
not returned anything
GET /courses 200 14.548 ms - -
null
[
RowDataPacket {
idcourse: 1,
name: 'Whatever 101',
description: 'A course about nothing',
thumbnail: null,
price: 10.99
},
RowDataPacket {
idcourse: 2,
name: 'Anything 101',
description: 'Course about idk',
thumbnail: null,
price: 9.99
}
]
returning res = [object Object],[object Object]
您肯定需要将 getAllCourses
转换为异步函数(使用 new Promise
),然后在路由处理程序中像这样更改您的代码:
router.get("/", function (req, res, next) {
coursesController.getAllCourses().then(courses => {
res.json(courses); // there is no need to use status(200) and res.end if you use res.json
});
});
不要忘记为所有路由添加错误处理程序或在 then
之后添加 catch
调用以在从 DB