许诺返回节点module.exports中未定义

时间:2019-02-20 21:59:30

标签: javascript node.js express promise

Promise在尝试登录undefined时返回routes.js,但是在登录queries.js时运行良好。我应该如何更改承诺才能正确返回对routes.js的答复?

queries.js中:

const rsClient = require('./client.js');

const query = {
    one: 'SELECT * FROM my.db'
}

module.exports = {
    rsProdRecs: (req, res) => {
         rsClient.query(query.one)
            .then(res => {
                return res;
            })
            .catch(err => console.log(err));
    }
};

routes.js

var express = require('express');
var router = express.Router();
var queries = require('../queries');

router.get('/', function(req, res, next) {
  const data = queries.rsProdRecs();
  console.log(data)
  res.send(data);
});

module.exports = router;

2 个答案:

答案 0 :(得分:2)

您尝试添加resetData语句吗?

resetData

答案 1 :(得分:2)

您的代码存在一些问题。其他用户已经指出了第一个问题,您需要从rsProdRecs返回承诺。 thencatch块也有问题,以及如何在路由中使用该方法,如下面的代码所述:

module.exports = {
    rsProdRecs: (req, res) => {
        return rsClient.query(query.one);

        // This is redundant, you're not transforming res in any way so this can be omitted.
        // .then(res => {
        //     return res;
        // })

        // This will cause the promise to return 'undefined' if rsClient.query(...) rejects,
        // instead error handling should be done in the calling function.
        // .catch(err => console.log(err));
    }
};

您可以重构路线以正确使用Promise返回方法:

router.get('/', function (req, res, next) {
    // We cannot consume the "data" directly, we must wait for the promise to resolve.
    queries.rsProdRecs()
        .then((data) => {
            console.log(data);
            res.send(data);
        })
        .catch((err) => {
            console.log(err);
            res.status(500); // insert correct error response here
        });

});

或者使用async/await,因为您已经在使用ES6功能:

router.get('/', async function (req, res, next) {
    try {
        const data = await queries.rsProdRecs();
        console.log(data);
        res.send(data);
    } catch (e) {
        console.log(err);
        res.status(500);
    }
});