繁体   English   中英

链接顺序 api 调用并返回要排序的数据

[英]chaining sequential api calls and returning the data to be sorted

我正在构建一个 Express REST api。在 GET 中,我希望能够进行如下所示的 api 调用,然后对于每个结果,在不同的端点(未显示)调用相同的 api 使用结果中的值作为参数。

我无法弄清楚如何将此处显示的 api 调用与另一个调用定位到不同的端点,以便第二个调用等待第一个调用完成。 我认为使用“then”方法会有所帮助。

我还想知道是否有另一种不使用显示的块逻辑来获取数据的方法。 理想情况下,它将是两个连续的 api 调用的干净实例,然后能够在返回之前对返回的数据进行排序。 现在我知道它有点乱,任何关于更清洁的方法的建议都会很棒。

const express = require('express');
const router = express.Router();
const https = require('https');

const url = '/https://github.com/:user/:reponame'

router.get(url, async function (req, res) {
    const user = req.params.user;
    const reponame = req.params.reponame;
    const options = {
        hostname: 'api.github.com',
        path: '/repos/' + user + '/' + reponame + '/commits',
        headers: {
            'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1521.3 Safari/537.36'
        },
        OAUth: <key>
    }   


    https.get(options, function (apiResponse) {
        let data = '';

        // a data chunk has been received.
        apiResponse.on('data', (chunk) => {
          data += chunk;
        });
      
        apiResponse.on('end', () => {
          res.send(JSON.parse(data))
        });
       
    }).on('error', (e) => {
        console.log(e);
        res.status(500).send('Error');
    })
})//2nd api call here?

module.exports = router;```

您需要使用 Promise 将带有回调的此https.get function 转换为异步 function(例如,请参阅此答案)。

async function getAsync(options) {
  return new Promise((resolve, reject) => {
https.get(options, function (apiResponse) {
        let data = '';

        // a data chunk has been received.
        apiResponse.on('data', (chunk) => {
          data += chunk;
        });
      
        apiResponse.on('end', () => {
          resolve(data);
        });
       
    }).on('error', (e) => {
        reject(e);
    })
  })
}

用法:

try {
  const data = await getAsync(options);
} catch(err) {
  console.error(err);
  res.status(500).send('Error');
  return;
}
try {
  const anotherData = await getAsync(anotherOptions);
} catch(err) {
  console.error(err);
  res.status(500).send('Another error');
  return;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM