我正在做一个示例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;
这是我的控制器/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 获取课程时处理错误