обещание возвращает неопределенное значение в узле module.exports - PullRequest
0 голосов
/ 21 февраля 2019

Обещание возвращает 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 голосов
/ 21 февраля 2019

Есть несколько проблем с вашим кодом.На первую проблему уже указали другие пользователи, вам нужно вернуть обещание от rsProdRecs.Блоки then и catch также проблематичны, так же как и то, как вы используете метод в своем маршруте, как описано в коде ниже:

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);
    }
});
0 голосов
/ 21 февраля 2019

Вы пытались добавить return заявление?

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

...