【问题标题】:Node JS Express Call Multiple APIs and return a Single ResponseNode JS Express 调用多个 API 并返回单个响应
【发布时间】:2018-07-21 02:38:44
【问题描述】:

我对Node非常陌生,希望有人能提供帮助。 我有 2 个在我的项目外部的 API。 我想在我的 Node Express 服务器中创建一个端点,该端点返回两个调用的结果。 我该怎么做?

到目前为止,我想出了如何像这样调用外部资源,

app.use('/myapi', function(req, res) {  
  var url = 'https://some-service.com/api1';
  res.setHeader('content-type', 'application/json');
  req.pipe(request(url)).pipe(res);
});

这会将结果返回给我的应用程序。我想不通的是如何进行第二次调用,然后将结果组合成这样的对象,

{ response1, response2 }

有谁知道如何做到这一点,或者指出我正确的方向? 还有一种方法可以在向我的应用程序发送响应之前确保两个调用都成功。

谢谢。

【问题讨论】:

  • 我相信您将不得不使用 Promise 库的方法来执行此操作,例如“Promise.all”。它接受一组 promise 对象并使用一组结果进行解析。
  • 将请求转置为async,得到两个请求await。
  • 相信我,你会在互联网上找到很多关于如何做到这一点的文章。

标签: node.js express


【解决方案1】:

您必须使用 promise 这样的功能,因为外部调用可能会花费自己的时间。您可以等待调用完成并发送最终响应。

您可以将路线更新为以下内容:

app.use('/myapi', function(req, res) {  
  var url = 'https://some-service.com/api1';
  res.setHeader('content-type', 'application/json');
  var responseOne =  await CallFirstSystem();
  var responseTwo = await CallSecondSystem();
  var finalResponse  = doSomeLogic(responseOne,responseTwo);
  res.send(finalResponse);
});

创建单独的函数来调用和处理响应

   

function CallFirstSystem() {
    return new Promise(async function (resolve, reject) {
        try {
            var url = "http://firssytem/api";
            var updateResult = [];
               await axios.get(url, JSON.stringify(requestPayLoad), {
                        headers: {
                            'Accept': 'application/json',
                            'Content-Type': 'application/json'                            
                        },
                    }).then(function (response) {
                        updateResult = innerLogicOne(response);
                    })
                    .catch(function (error) {
                        console.log(error);
                    });                
            resolve(updateResult);
        } catch (err) {
            console.log(err)
        } finally {}
    }).catch((err) => {
        console.log(err)
    });
}



function CallSecondSystem() {
    return new Promise(async function (resolve, reject) {
        try {
            var url = "http://secondSystem/api";
            var updateResult = [];
               await axios.get(url, JSON.stringify(requestPayLoad), {
                        headers: {
                            'Accept': 'application/json',
                            'Content-Type': 'application/json'                            
                        },
                    }).then(function (response) {
                        updateResult = innerLogicOne(response);
                    })
                    .catch(function (error) {
                        console.log(error);
                    });                
            resolve(updateResult);
        } catch (err) {
            console.log(err)
        } finally {}
    }).catch((err) => {
        console.log(err)
    });
}

我正在使用axios调用API,你可以随意使用任何其他库来调用外部系统API。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2015-08-24
    • 1970-01-01
    • 2019-07-12
    • 1970-01-01
    • 1970-01-01
    • 2019-01-31
    • 2017-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多