我正在研究如何使用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调用并合并data1
,data2
和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);
答案 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
将立即被拒绝。这种快速失败行为是额外的性能优势。