node.js - ASYNC/AWAIT 用于链接多个 http.requests

标签 node.js async-await

我如何在另一个 http.request 的响应中链接一个 http.request ,然后在进入前端之前将它们推送到一个数组中?

router.get("/:team", (req, res) => {


  let teamParams = teams[req.params.team];
  twitter.get("search/tweets", teamParams, (err, data, resp) => {
    let tweetArr = [];
    let text = data.statuses;
    text.map((dat) => {
      let im = dat.entities.urls[0].url
      dat.links = im;
      tweetArr.push(dat);
    });
  

   res.json({ message: "Success", tweets: tweetArr });
  });
});

目前,我通过它循环获取数据对象,并添加一个 url 作为属性。现在,我想在使用 res.json 之前链接另一个 http 请求,以对另一个 API 进行 API 调用并获取响应。 我尝试了使用 Promise 的解决方法,但我永远无法使用第二个 api 调用的响应返回完整的对象。

这就是我到目前为止所拥有的,我已经设法达到我的对象包含来自第二个链接的请求的程度。如何将所有推文返回到我最终可以解析的数组中?

require("dotenv").config();
const Twitter = require("twitter");
const API_IMAGE_PREV = "http://api.linkpreview.net/";
const request = require("request");
const key = process.env.IM_PREV_KEY;

let twitter = new Twitter({
  consumer_key: process.env.TWITTER_CONSUMER_KEY,
  consumer_secret: process.env.TWITTER_CONSUMER_SECRET,
  bearer_token: process.env.TWITTER_BEARER_TOKEN
});
let teamParams = {
  q: "from:ManUtdMEN MUFC",
  count: 2,
  result_type: "recent"
};


var third = function thirdUrl(next) {
  var promise = new Promise(function(resolve, reject) {
    next.forEach(x => {
      let ln = x.links;
      const options = {
        url: "http://api.linkpreview.net/?key=" + key + "&q=" + ln,
        method: "get"
      };
      request.get(options, (err, req, res) => {
        if (err) {
          console.log(err);
        } else {
          x.desc = res;
        }
      });
    });
  });
};

var second = function secondUrl(previous) {
  var promise = new Promise(function(resolve, reject) {
    let p = previous.statuses;
    let links = [];
    p.forEach(t => {
      let l = t.entities.urls[0].url;
      t.links = l;
    });

    resolve(p);
  });
  return promise;
};

twitter
  .get("search/tweets", teamParams)
  .then(second)
  .then(third)
  .catch(function(error) {
    throw error;
  });

最佳答案

您使用什么模块来处理 http 请求?这是一个使用 axios 的示例。

const axios = require('axios');

router.get("/:team", (req, res) => {
  let teamParams = teams[req.params.team];
  twitter.get("search/tweets", teamParams, async (err, data, resp) => {
    let tweetArr = [];
    let text = data.statuses;
    text.map((dat) => {
      let im = dat.entities.urls[0].url
      dat.links = im;
      tweetArr.push(dat);
    });
    let res = await Promise.all(tweetArr.map(dat => axios.get(dat.links));
    res.json({ message: "Success", tweets: res });
  });
})

关于node.js - ASYNC/AWAIT 用于链接多个 http.requests,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51254567/

相关文章:

javascript - Socket.io - 消除抖动?

javascript - 抛出自定义错误 async/await try-catch

json - 如何获取|在Flutter中将json数据加载到List <myClass>确实可以吗?

python - 如何在 Airflow 中运行异步函数?

c# - 带有 ref/out 参数的方法的异步版本的元组与自定义结构

javascript - Nodejs readline 回调

node.js - 带有redis的 Node js不返回调用者

javascript - 从 Javascript (Node) 调用 R 函数

node.js - 护照天蓝色广告 : which strategy to use

c# - Monotouch 应用程序中的线程数