#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
для обработки ошибок при получении курсов из БД