Express +猫鼬:异步/等待返回未定义

时间:2018-10-20 18:52:24

标签: node.js express controller routes async-await

我正在尝试将路由代码与数据库代码分开,但是当路由调用控制器方法时,我陷入了错误。

我有 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

执行不等待controller.getAll(criteria)

我尝试了一些发现类似问题的代码,例如try / catch async call,但是没有用,或者我错过了一些细节。

谢谢。

2 个答案:

答案 0 :(得分:0)

原因:您控制器的exports.getAll = async (criteria) => { // Return value! return await model.find(criteria, '-__v'); } 方法未返回任何值。

您应该这样做:

 from("direct:myRoute1")
                .bean(new DemoRoute(), "test(Demo,xxx)")
                .end();


 from("direct:myRoute2")
                .bean(new DemoRoute(), "test(Demo,xxx)")
                .end(); 



public interface Shape

@Component
class Circle implements Shape{
}

@Component
class Square implements Shape{}

答案 1 :(得分:0)

谢谢,@ 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);
    }
});