Обратный звонок работает некорректно NodeJS ExpressJS

Я создаю 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

res.json ({статус: 200, все_продукты});

Joe Warner 10.04.2018 17:03

Либо отправьте данные в функцию обратного вызова, либо используйте async / await, promises или что-нибудь еще. Вы не можете вернуться из такой асинхронной операции

Luca Kiebel 10.04.2018 17:04

Возможный дубликат Как мне вернуть ответ от асинхронного вызова?

Luca Kiebel 10.04.2018 17:05
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
3
46
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы должны управлять асинхронным вызовом, вы можете сделать это с помощью 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.

Другие вопросы по теме