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;
答案 0 :(得分:2)
您尝试添加resetData
语句吗?
resetData
答案 1 :(得分:2)
您的代码存在一些问题。其他用户已经指出了第一个问题,您需要从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);
}
});