Как обрабатывать задержку базы данных на узле-mysql при вызове метода из другого js-скрипта

#node.js #express #node-mysql

#node.js #экспресс #узел-mysql

Вопрос:

Я делаю пример 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, у меня появляется только пустой экран. Это то, чего мне не хватает? Может быть, какая-то асинхронная функциональность или что-то в этом роде?

Это консоль.результаты журнала:

   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]
  

Ответ №1:

Вам обязательно нужно перейти getAllCourses в асинхронную функцию (use 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
  });
});

  

Не забудьте добавить обработчик ошибок для всех маршрутов или добавить catch call after then для обработки ошибок при получении курсов из БД