【问题标题】:Express + Mongoose: async/await returning undefinedExpress + Mongoose:异步/等待返回未定义
【发布时间】:2019-03-25 07:55:02
【问题描述】:

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

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

我尝试了一些寻找类似问题的代码,例如尝试/捕获异步调用,但没有成功,或者我错过了一些细节。

提前致谢。

【问题讨论】:

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


    【解决方案1】:

    原因:你的控制器的getAll 方法没有返回任何值。

    你应该这样做:

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

    【讨论】:

    • 我现在明白了。所以我的控制器必须只返回数据,并且路由必须使用它并在必要时添加任何其他信息。
    • 这取决于你,你也可以在控制器中使用你的数据。只需考虑使用 async/await 或 promise 返回一些值。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-06
      • 2021-04-20
      • 2019-03-09
      • 1970-01-01
      • 1970-01-01
      • 2018-11-17
      • 2018-06-11
      相关资源
      最近更新 更多