Экспресс-маршрутизация с несколькими HTTP-запросами на стороне сервера к стороннему API - PullRequest
0 голосов
/ 01 апреля 2019

Я хочу использовать кнопку в своем приложении AngularJS, чтобы сделать HTTP-запрос на стороне клиента к NodeJS, а затем изнутри NodeJS сделать несколько HTTP-запросов на стороне сервера к стороннему API.У меня проблемы с выполнением нескольких HTTP-запросов к стороннему API.Я использую AngularJS 1.5.

myController.js

function onClick() {
  return MyAngularService.lookup()
    .then(function(response) {
      console.log(response)
    })
}

my-angular-service.js

function lookup()  {

  return $http({
    method: 'GET', 
    url: '/lookup’
  })
}

lookup-route.js

const rp = require('request-promise')
const Promise = require('bluebird')
const router = require('express').Router()

router.get('/lookup', lookup) 


function lookup(req, res, next) {

    const urls = ['https://jsonplaceholder.typicode.com/todos/1', 'https://jsonplaceholder.typicode.com/todos/2']

    const doRequest = function(url) {
      return rp(url)
        .then(function(response) {
          return res.json(response)
        })
    }

    const requests = [];

    for (let i=0; i < urls.length; i++) {
      const url = urls[i]
      requests.push(doRequest(url))
    }
    return Promise.all(requests)
      .then(res.json(requests))
 }

Когда я console.log(response.data) в myController.js, я получаю {isFulfilled: false, isRejected: false} для каждого из сторонних URL, с которых я хочу получить данные.

Как вернуть JSON из стороннего API обратно на мой контроллер?

1 Ответ

1 голос
/ 01 апреля 2019

В коде серверной части мне бросается в глаза то, что:

  1. Отправка res.json внутри каждой функции "doRequest" (что означает, что вы получите один ответ от третьей стороны)API - в зависимости от того, что выполняется первым)
  2. Создание цепочки в конце метода Promise.all путем выполнения .then(res.json(requests)), что приводит к раннему запуску обратного вызова;вместо того, чтобы делать что-то вроде .then(res.json) или .then(function(data){ return res.json(data); })

Попробуйте обновить реализацию экспресс-маршрута -

const rp = require('request-promise')
const router = require('express').Router()

router.get('/lookup', lookup) 

function lookup(req, res) {

    const urls = ['https://jsonplaceholder.typicode.com/todos/1', 'https://jsonplaceholder.typicode.com/todos/2']

    // map the array of urls to an array of promises
    const promisesArray = urls.map(function(url){
        return rp(url);
    });

    // once all promises are fulfilled, return array of data as json response
    Promise.all(promisesArray).then(function(responseArray){
        return res.json(responseArray)
    });
 }
...