Я создаю API с ExpressJS и NodeJS, пытаясь обдумать обратный вызов. Почему-то обратный вызов не возвращает результат запроса при вызове через Postman API. В чем может быть проблема
router.get('/products', PipedriveController.pipedriveAllProducts)
// Export the router
module.exports = router;
var request = require('request');
var results;
function logRes(){
console.info(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 Postman, когда я использую API,
Результат:
{
"status": 200
}
Я должен ожидать статуса 200 и вывода API JSON
Либо отправьте данные в функцию обратного вызова, либо используйте async / await, promises или что-нибудь еще. Вы не можете вернуться из такой асинхронной операции
Возможный дубликат Как мне вернуть ответ от асинхронного вызова?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы должны управлять асинхронным вызовом, вы можете сделать это с помощью 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') }
}
Я использую здесь стрелочную функцию, чтобы код был более читабельным.
Если вам нужна дополнительная информация о обещаниях: 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
При условии, что другая часть вашего приложения работает нормально, это изменение, которое вы должны сделать здесь
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.
res.json ({статус: 200, все_продукты});