【问题标题】:Can you append the result of multiple 'get' requests and send that out as a 'get 'response?您可以附加多个“获取”请求的结果并将其作为“获取”响应发送出去吗?
【发布时间】:2020-09-10 17:41:50
【问题描述】:

在过去的几个小时里,我一直在玩弄这个,我一生都无法弄清楚为什么它会返回一个空值列表。

function getFile(file) {
    var request = require("request");
    request(
      {
      uri:
          file,
      method: "GET",
      gzip: true,
      qs: {
          format: "json",
      },
      },
      (err, resp, body) => {
        console.log(body);
        return body
      }
    )
}

async function download_tire_json_from_firebase() {

  let files = ['https://firebasestorage.googleapis.com/v0/b/moberra-tire-api.appspot.com/o/tire-data-eco%2Fforceum.json?alt=media&token=ed9db67c-d744-414f-8812-21cfbba63447',
                'https://firebasestorage.googleapis.com/v0/b/moberra-tire-api.appspot.com/o/tire-data-eco%2Fgood-year.json?alt=media&token=1131b553-e2e5-4ff6-87cb-f346e57e389e',
                'https://firebasestorage.googleapis.com/v0/b/moberra-tire-api.appspot.com/o/tire-data-eco%2Fgt-radial.json?alt=media&token=d2ba3f51-cef7-494e-8006-61d321d677cd',
                'https://firebasestorage.googleapis.com/v0/b/moberra-tire-api.appspot.com/o/tire-data-eco%2Fkpatos.json?alt=media&token=75743c44-1521-4ff4-8133-e56a474f7c3e',
                'https://firebasestorage.googleapis.com/v0/b/moberra-tire-api.appspot.com/o/tire-data-eco%2Fland-spider.json?alt=media&token=22a3aa7b-18a9-4bd1-b34b-5ae48cadbc55',
                'https://firebasestorage.googleapis.com/v0/b/moberra-tire-api.appspot.com/o/tire-data-eco%2Fleao-tires.json?alt=media&token=84dcc7f8-de32-46a9-9aae-854639772975',
                'https://firebasestorage.googleapis.com/v0/b/moberra-tire-api.appspot.com/o/tire-data-eco%2Fwanli.json?alt=media&token=4bb13f3a-5d9a-4c2d-b558-964ee996a534',
                'https://firebasestorage.googleapis.com/v0/b/moberra-tire-api.appspot.com/o/tire-data-eco%2Fzeta.json?alt=media&token=c04f973c-2577-4f06-805e-68e46480e9ae'
              ]
  const results = []

  for(const file of files) {
    results.push(getFile(file));
  }
  console.log("Final Result:", results)
  return await Promise.all(results)
}

app.get("/get-tire-data", async (req, res) => {
  let results = await download_tire_json_from_firebase()
  res.send(JSON.stringify(results))
})

奇怪的是,在我的节点控制台中,'' console.log("Final Result:", results) '' 打印出预期的列表。好像该列表没有进入“get-tire-data”获取请求。

另外,如果有人知道如何简化上述代码,我也将不胜感激。

【问题讨论】:

    标签: javascript node.js promise async-await


    【解决方案1】:

    Promise.all 需要一个 promise 数组,因此 getFile 方法应该返回一个 promise。

    const request = require('request');
    const files = [
      'https://firebasestorage.googleapis.com/v0/b/moberra-tire-api.appspot.com/o/tire-data-eco%2Fforceum.json?alt=media&token=ed9db67c-d744-414f-8812-21cfbba63447',
      'https://firebasestorage.googleapis.com/v0/b/moberra-tire-api.appspot.com/o/tire-data-eco%2Fgood-year.json?alt=media&token=1131b553-e2e5-4ff6-87cb-f346e57e389e',
      'https://firebasestorage.googleapis.com/v0/b/moberra-tire-api.appspot.com/o/tire-data-eco%2Fgt-radial.json?alt=media&token=d2ba3f51-cef7-494e-8006-61d321d677cd',
      'https://firebasestorage.googleapis.com/v0/b/moberra-tire-api.appspot.com/o/tire-data-eco%2Fkpatos.json?alt=media&token=75743c44-1521-4ff4-8133-e56a474f7c3e',
      'https://firebasestorage.googleapis.com/v0/b/moberra-tire-api.appspot.com/o/tire-data-eco%2Fland-spider.json?alt=media&token=22a3aa7b-18a9-4bd1-b34b-5ae48cadbc55',
      'https://firebasestorage.googleapis.com/v0/b/moberra-tire-api.appspot.com/o/tire-data-eco%2Fleao-tires.json?alt=media&token=84dcc7f8-de32-46a9-9aae-854639772975',
      'https://firebasestorage.googleapis.com/v0/b/moberra-tire-api.appspot.com/o/tire-data-eco%2Fwanli.json?alt=media&token=4bb13f3a-5d9a-4c2d-b558-964ee996a534',
      'https://firebasestorage.googleapis.com/v0/b/moberra-tire-api.appspot.com/o/tire-data-eco%2Fzeta.json?alt=media&token=c04f973c-2577-4f06-805e-68e46480e9ae'
    ];
    const getFile = (url) => new Promise((resolve, reject) => {
      request({
          uri: url,
          method: "GET",
          gzip: true,
          qs: {
            format: "json"
          },
        },
        (err, resp, body) => err ? reject(err) : resolve(body)
      )
    });
    app.get("/get-tire-data", async(req, res) => {
      const results = await Promise.all(files.map(url => getFile(url)));
      res.send(JSON.stringify(results))
    });

    【讨论】:

    • 谢谢丹!感谢您抽出宝贵的时间和快速的反应:)
    【解决方案2】:

    你需要在getFile中返回一个Promise

    function getFile(file) {
        var request = require("request");
        return new Promise((resolve, reject) => {
          request(
            {
            uri:
                file,
            method: "GET",
            gzip: true,
            qs: {
                format: "json",
            },
            },
            (err, resp, body) => {
              if (err) {
                reject(err)
              } else {
                resolve(body)
              }
            }
          )
        })
    }
    

    您可以使用我创建的library 来简化您的代码。

    const { map } = require('rubico')
    const request = require('request')
    
    const urls = [
      'https://firebasestorage.googleapis.com/v0/b/moberra-tire-api.appspot.com/o/tire-data-eco%2Fforceum.json?alt=media&token=ed9db67c-d744-414f-8812-21cfbba63447',
      'https://firebasestorage.googleapis.com/v0/b/moberra-tire-api.appspot.com/o/tire-data-eco%2Fgood-year.json?alt=media&token=1131b553-e2e5-4ff6-87cb-f346e57e389e',
      'https://firebasestorage.googleapis.com/v0/b/moberra-tire-api.appspot.com/o/tire-data-eco%2Fgt-radial.json?alt=media&token=d2ba3f51-cef7-494e-8006-61d321d677cd',
      'https://firebasestorage.googleapis.com/v0/b/moberra-tire-api.appspot.com/o/tire-data-eco%2Fkpatos.json?alt=media&token=75743c44-1521-4ff4-8133-e56a474f7c3e',
      'https://firebasestorage.googleapis.com/v0/b/moberra-tire-api.appspot.com/o/tire-data-eco%2Fland-spider.json?alt=media&token=22a3aa7b-18a9-4bd1-b34b-5ae48cadbc55',
      'https://firebasestorage.googleapis.com/v0/b/moberra-tire-api.appspot.com/o/tire-data-eco%2Fleao-tires.json?alt=media&token=84dcc7f8-de32-46a9-9aae-854639772975',
      'https://firebasestorage.googleapis.com/v0/b/moberra-tire-api.appspot.com/o/tire-data-eco%2Fwanli.json?alt=media&token=4bb13f3a-5d9a-4c2d-b558-964ee996a534',
      'https://firebasestorage.googleapis.com/v0/b/moberra-tire-api.appspot.com/o/tire-data-eco%2Fzeta.json?alt=media&token=c04f973c-2577-4f06-805e-68e46480e9ae'
    ]
    
    const getFile = url => new Promise((resolve, reject) => {
      request({
        uri: url,
        method: "GET",
        gzip: true,
        qs: { format: "json" },
      }, (err, resp, body) => err ? reject(err) : resolve(body))
    })
    
    // urls => tire_json_data
    const download_tire_json_from_firebase = map(getFile)
    
    app.get("/get-tire-data", async (req, res) => {
      let results = await download_tire_json_from_firebase(urls)
      res.send(JSON.stringify(results))
    })
    

    【讨论】:

      猜你喜欢
      • 2020-10-05
      • 1970-01-01
      • 1970-01-01
      • 2011-04-08
      • 1970-01-01
      • 2018-03-28
      • 1970-01-01
      • 1970-01-01
      • 2011-12-21
      相关资源
      最近更新 更多