Koa2:中间层,用于组合多个REST API调用

时间:2017-10-11 10:47:51

标签: koa2

我正在研究如何使用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);
    })
});

此解决方案基于promiserequest-promise返回一个承诺,允许我链接3个API调用并合并data1data2data3如上所述。

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);

1 个答案:

答案 0 :(得分:1)

如果您使用async-await,则必须等待每个诺言依次解决,如果您不需要将结果从一个请求传递到下一个请求,那么这可能没有效果。相反,您可以使用Promise.all并行执行promise,这将返回结果数组。

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将立即被拒绝。这种快速失败行为是额外的性能优势。