我正在使用ExpressJS和NodeJS创建一个API,试图绕过回调。不知怎的,当通过Postman API调用时,Callback没有返回请求结果。可能是什么问题
router.get('/products', PipedriveController.pipedriveAllProducts)
// Export the router
module.exports = router;
var request = require('request');
var results;
function logRes(){
console.log(results);
return results
}
function readResult(callback){
request('https://jsonplaceholder.typicode.com/posts/1', function(err, response, body){
results=body;
callback();
});
}
exports.pipedriveAllProducts = function(req, res, next){
// let family = req.param.options;
try {
let all_products = readResult(logRes)
// Return All product liist with Appropriate HTTP header response
return res.status(200).json({status: 200, all_products});
} catch(e){
// Return an Error Response Message
return res.status(400).json({status: 400, message: e.message});
}
}
我使用API时的My Postman API输出
结果:
{
"status": 200
}
我应该期待状态200& API JSON输出
答案 0 :(得分:1)
您必须管理异步调用,您可以使用javascript Promise:
function readResult() {
return new Promise((resolve, reject) => {
request('https://jsonplaceholder.typicode.com/posts/1', (err, response, body) => {
if(err) reject(err);
resolve(body);
});
});
}
exports.pipedriveAllProducts = function(req, res, next) {
readResult()
.then(
products => res.status(200).json(products),
err => res.status(404).json(err)
).catch(err) { res.status(500).send('Unexpected server error') }
}
我在这里使用箭头函数来获得更易读的代码。
如果您想了解有关Promises的更多信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise 或箭头功能:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions
答案 1 :(得分:0)
如果您的申请的其他部分工作正常,这是您应该在此处进行的更改
router.get('/products', PipedriveController.pipedriveAllProducts)
// Export the router
module.exports = router;
var request = require('request');
function readResult(callback){
request('https://jsonplaceholder.typicode.com/posts/1', function(err,
response, body){
callback(err, body);
});
}
exports.pipedriveAllProducts = function(req, res, next){
// let family = req.param.options;
readResult(function(err, result){
if(err){
return res.status(400).json({status: 400, message: e.message});
}else{
return res.status(200).json({status: 200, all_products});
}
})
}
}
您应该尝试使用更新的节点库,例如async await或promises。