Почему этот контроллер mongodb передает неопределенное обратно на маршрут? - PullRequest
0 голосов
/ 17 февраля 2020

Приложение использует basi c Node.js, Express и MongoDB для возврата некоторых данных по разным маршрутам.

Маршрут:

router.get('/api/v1/:collection', (req, res, next) => {
    try {
        const data = ApiController.getAllRecipes(req, res, next);
        console.log(data);
        res.send(data);
    } catch(error) {
        res.send(error);
    }
});

Методы, которые запрашивают база данных содержится в простом контроллере:

module.exports = {
    getAllRecipes: async (req, res, next) => {
        try {
            req.app.db.collection(req.params.collection).find({}).toArray((error, result) => {
                if (result.length > 0) {
                    console.log(result);
                    return result;
                } else {
                    let error = new Error();
                    error.statusCode = 404;
                    error.message = 'No API results found.';
                    next(error);
                }
            });
        } catch (error) {
            next(error);
        }
    }
};

Внутри контроллера console.log(result); возвращает правильные данные, которые я хотел бы обработать в файле маршрута. Однако console.log(data); в файле маршрута возвращает undefined, даже в пределах блока try/catch.

Я что-то упускаю при передаче данных с контроллера обратно на маршрут? Спасибо:)

1 Ответ

0 голосов
/ 17 февраля 2020

Нашли решение! Поскольку контроллер является асинхронным, ему не нужно возвращать данные, а просто сохранить их в res.locals и выполнить метод Express 'next() для продолжения с маршрутом.

Обновленный маршрут:

router.get('/api/v:versionNumber/:collection', ApiController.getAllRecipes, (req, res, next) => {
    res.send(res.locals.results);
});

Обновлен контроллер:

getAllRecipes: async (req, res, next) => {
        try {
            req.app.db.collection(req.params.collection).find({}).toArray((error, result) => {
                if (result.length > 0) {
                    res.locals.results = result;
                    next();
                } else {
                    let error = new Error();
                    error.statusCode = 404;
                    error.message = 'No API results found.';
                    next(error);
                }
            });
        } catch (error) {
            next(error);
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...