将响应数据从一个http请求传递到下一个

时间:2019-08-21 09:35:20

标签: node.js express fetch

我正在尝试发出一个请求,然后使用接收到的数据将其传递给另一个将数据附加到URL的请求。

我试图在路由下面创建一个函数,然后在路由内部调用该函数,但这没用。

const express = require('express');
const router = express.Router();
const fetch = require('node-fetch');

let accId;

router.get('/:platform/:name', async (req, res) => {
    try {
        const headers = {
            'X-Riot-Token': process.env.TRACKER_API_KEY
        }

        const { platform, name } = req.params;

        const response = await fetch(`https://euw1.api.riotgames.com/lol/summoner/v4/summoners/by-name/${name}`, {
            headers
        });

        const data = await response.json();

        if(data.errors && data.errors.length > 0) {
            return res.status(404).json({
                message: 'No summoner found'
            })
        }
        res.json(data);
        accId = data.accountId;

    } catch (error) {
        console.error(error);
        res.status(500).json({
            message: 'Server Error'
        })
    }
});

module.exports = router;

在哪里看到变量accId,我想将其添加到URL,然后发出另一个请求。任何指针都很好,谢谢..

2 个答案:

答案 0 :(得分:1)

您无法发送第二个请求,因为您之前发送的响应是res.json(data)

我可以通过将数据传递到另一个端点来解决此问题。将数据添加到req.locals

req.locals.data = data;

然后重定向到您的另一个端点,您可以在其中处理第二个请求:

res.redirect(/other/endpoint);

在另一个端点中,您可以在处理accountId情况后将两个结果一起发送。

app.get(/other/endpoint, (req, res) => {
  res.send({ data: req.locals.data, accIdResult: doSomething(req.locals.data. accountId)});
});

答案 1 :(得分:0)

您可以通过使用超级代理来解决此问题。您可以使用异步等待或使用Promise。

const sa = require('superagent');

router.get('/:platform/:name', async (req, res) => {
    const url = 'YOUR_URL_ONE';
    const anotherUrl = 'YOUR_URL_Two';

    //Promisified request object
    const reqOne = sa.get(url).set('X-Riot-Token', 'process.env.TRACKER_API_KEY');   

    return reqOne.then((data) => { 
     // do whatever you want with data then call another url, you can change the mothod to post or put as well
        const reqTwo = sa.post(anotherUrl).set('X-Riot-Token', 'process.env.TRACKER_API_KEY').send(data);; 
      return reqTwo;
    }).then((data)=>{
    return res.json(data);
    }).catch(()=>{
       // handle expection
    });
});

module.exports = router;