Экспресс + Mongoose: асинхронное / ожидание возврата неопределенного - PullRequest
0 голосов
/ 20 октября 2018

Я пытаюсь отделить код маршрута от кодов базы данных, но застрял с ошибкой, когда маршрут вызывает метод контроллера.

У меня есть productRoutes.js :

router.route('/')
    .get(async (req, res, next) => {
        try {
            let criteria = {};
            for (const el in req.query) {
                criteria[el] = req.query[el];
            }
            console.log('Getting all products', criteria);

            const result = await controller.getAll(criteria);
            console.log('router result:', result);
            const status = (result.ok ? (result.count > 0 ? 200 : 404 ) : 400);
            return res.status(status).send(result);
        } catch (err) {
            return next(err);
        }
    });

productController.js :

exports.getAll = (criteria) => {
    model.find(criteria, '-__v').exec((err, records) => {
        const ok = (err ? false : true);

        let result = {}
        result.ok = ok;
        if (ok) {
            result.data = records;
            result.count = records.length;
        } else {
            result.count = 0;
            result.err = err;
        }

        console.log('controller result count:', result.count);

        return result;
    });
}

При выполнении это выдает:

Getting all products {}
router result: undefined
TypeError: Cannot read property 'ok' of undefined
    at router.route.post.get (C:\dev\projects\mercante\server\routes\productRoutes.js:58:36)
    at <anonymous>
    at process._tickCallback (internal/process/next_tick.js:188:7)
controller result count: 4

Выполнение не выполняетсяt ожидание controller.getAll(criteria).

Я пробовал некоторые коды, которые я нашел, ища похожие вопросы, такие как try / catch асинхронный вызов, но не работает, или я пропустил некоторые детали.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 20 октября 2018

Спасибо, @Rashad.Теперь это работает:

productController.js :

exports.getAll = async (criteria) => {
    return await model.find(criteria, '-__v');
}

productRoutes.js :

.get(async (req, res, next) => {
    try {
        let criteria = {};
        for (const el in req.query) {
            criteria[el] = req.query[el];
        }
        console.log('Getting all products', criteria);

        let result = {};
        const data = await controller.getAll(criteria);

        result.count = data.length;
        result.data = data;

        const status = (result.ok ? (result.count > 0 ? 200 : 404 ) : 400);
        return res.status(status).send(result);
    } catch (err) {
        return next(err);
    }
});
0 голосов
/ 20 октября 2018

Причина: метод getAll вашего контроллера не возвращает никакого значения.

Вы должны сделать что-то вроде этого:

exports.getAll = async (criteria) => {
    // Return value!
    return await model.find(criteria, '-__v');
}
...