HTTP-запросы NodeJS обещают и сохраняют результаты в переменных - PullRequest
0 голосов
/ 27 октября 2018

Я создаю интерфейсное приложение, которое отправляет HTTP-запросы к двум отдельным API.

http://greetings_api:3000/getGreeting
  data {'language': 'es'}
Response: 'Hola'

http://users_api:3000/getUser
  data {'userid': 1}
Response: 'Jose Smith'

У меня есть один маршрут, который делает запрос к этим API, а затем возвращает эти ответы:

var http = require('http');
var request = require('request-promise');

var greetingOptions = {
    uri: 'http://greetings_api:3000/getGreeting',
    hostname: 'greetings_api',
    method: 'POST',
    headers: {
            'Content-Type': 'application/json',
            'language': 'es'
    }
};

var greeting = {
    getGreeting: function() {
        return request(greetingOptions);
    }
}

function myGreeting() {
    return greeting.getGreeting();
};

var userOptions = {
    uri: 'http://users_api:3000/getUser',
    hostname: 'users_api',
    method: 'POST',
    headers: {
            'Content-Type': 'application/json',
            'id': 1
    }
};

var user = {
    getUser: function() {
        return request(userOptions);
    }
}

function myUser() {
    return user.getUser();
};

function getWelcome(req, res) {

    // How do you store this....
    myUser().then(function(result) {
        console.log('result')
        return result;
    })

    // ...and this...
    myGreeting().then(function(result) {
      console.log('Greet ' + result);
        return result;
    });

    /// ...and then send them with this?
    res.send(greeting + ' ' + user);
}

module.exports = { getWelcome };

Так что с текущим кодом я получаю правильный вывод в консоли. Проблема в том, что мне нужно иметь возможность отправить ответ от маршрута с комбинацией обоих ответов API. Какой самый простой способ сделать это?

Ответы [ 2 ]

0 голосов
/ 27 октября 2018

Вы отправляете ответ до разрешения обещаний.

с async / await мы можем написать асинхронный код, который выглядит и ведет себя как синхронный.

async function getWelcome(req, res) {
  // we can wrap our operation in a try/catch block to handle
  // both asynchronous and synchronous errors
  try {
    // with the await keyword we can wait for all promises to resolve
    // before we continue with our code

    /* if one of the promises inside Promise.all rejects we move to the catch block */
    const [user, greeting] = await Promise.all([
      myUser(),
      myGreeting()
    ]);
    // send the response if no errors
    res.send(greeting + ' ' + user);
    catch(e) {
      res.status(404).send();
    }
}
0 голосов
/ 27 октября 2018

Вам нужно сделать 2 параллельных запроса и отправить ответ после выполнения обоих.Здесь вам может помочь функция Promise.all .

Promise.all([myUser(), myGreeting()]).then(function(result) {
    // result[0] - user
    // result[1] - greeting
    res.send(result[0] + ' ' + result[1]);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...