从另一个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

获取课程时处理错误