【问题标题】:Express routing with server-side multiple HTTP requests to 3rd party API使用服务器端多个 HTTP 请求快速路由到第 3 方 API
【发布时间】:2019-08-23 00:07:13
【问题描述】:

我想在我的 AngularJS 应用程序中使用一个按钮向 NodeJS 发出客户端 HTTP 请求,然后从 NodeJS 中向第 3 方 API 发出多个服务器端 HTTP 请求。我无法向第 3 方 API 发出多个 HTTP 请求。我正在使用 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))
 }

当我在myController.jsconsole.log(response.data) 时,我得到{isFulfilled: false, isRejected: false} 用于我想从中获取数据的每个第3 方网址。

如何将来自 3rd 方 API 的 JSON 返回到我的控制器?

【问题讨论】:

    标签: javascript node.js angularjs express request-promise


    【解决方案1】:

    服务器端代码让我印象深刻的是:

    1. 在每个“doRequest”函数内发送res.json(这意味着您将从第 3 方 API 返回一个响应 - 以先完成者为准)
    2. 通过执行.then(res.json(requests)) 链接到 Promise.all 方法的末尾,这会导致回调提前运行;而不是像.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)
        });
     }
    

    【讨论】:

    • 更新快速路由后,控制器没有返回任何内容。当我在调试器中单步执行时,它会点击 Promise.all(promisesArray) 但会跳过 .then() .... 下的所有内容
    • 添加.catch() 方法以查看任何错误。如果任何一个 Promise 被拒绝解决,Promise.all 将被拒绝并使用相同的拒绝值。对于多次拒绝,Promise.all 将具有第一个解决被拒绝的承诺的拒绝值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-06
    • 1970-01-01
    相关资源
    最近更新 更多