0

我正在研究如何使用 node.js 作为中间层将多个 REST API 调用组合成单个请求。(这样就省去了浏览器和服务器之间的往返)
首先,我使用了express框架和request-promise库,找到了如下解决方案:

var express = require('express');
var app = express();
var request = require('request-promise');
var port = process.env.PORT || 8003;
app.get('/merge', function(req, res) {
    var data1, data2, data3;
    request('http://localhost:8000/api1').then(function(body) {
        data1 = JSON.parse(body);
        return request('http://localhost:8000/api2');
    })
    .then(function(body) {
        data2 = JSON.parse(body);
        return request('http://localhost:8000/api3');
    })
    .then(function(body) {
        data3 = JSON.parse(body);
        var alldata = Object.assign({}, data1, data2, data3);
        res.json(alldata);
    })
});

该解决方案promise基于request-promise返回一个承诺,它允许我将 3 个 API 调用和 merge 链接在一起data1data2并且data3如上所述。

Koa2(async/await)如何做到这一点?

编辑,找到解决方案如下:

var koa = require('koa');
var serve = require('koa-static');
var route = require('koa-route');
const request = require('request-promise');
var app = new koa();


const main = async ctx => {

    let name = await getName();
    let city = await getCity();
    let gender = await getGender();
    ctx.response.body = `${name}${city}${gender}`;
};

function getName() {
   return request('http://localhost:8000/api1');
};

function getCity() {
  return request('http://localhost:8000/api2');
};

function getGender() {
   return request('http://localhost:8000/api3');
};

app.use(route.get('/merge', main));
app.listen(3000);
4

1 回答 1

1

如果您使用async-await,您将不得不等待每个承诺按顺序解决,如果您不需要将结果从一个请求提供给下一个请求,这可能效率不高。Promise.all相反,您可以使用将返回结果数组的并行执行承诺。

function getName() {
  return request('http://localhost:8000/api1');
};

function getCity() {
  return request('http://localhost:8000/api2');
};

function getGender() {
  return request('http://localhost:8000/api3');
};

const main = async ctx => {
  const results = await Promise.all([getName(), getCity(), getGender()]);
  // return the results as a single string
  ctx.response.body = results.join('');
};

Promise.all如果任何承诺元素被拒绝,则拒绝。如果其中一个承诺立即拒绝,则将Promise.all立即拒绝。这种快速失败的行为是一个额外的性能优势。

于 2018-08-08T22:35:43.457 回答