节点,快速API网关

我正在尝试创build一个简单的API网关types的项目,它接收传入的路由并将它们redirect到其他外部apis。 我试图让一个/test的传入路由去google.com或任何其他的API与一些req.body,但我不认为我做对了。

 var app = express(); app.get('/test', function(req, res){ var options = { host: 'www.google.com', port: 80, path: '/index.html' }; var req = http.get(options, function(res) { console.log("Got response: " + res.statusCode); }).on('error', function(e) { console.log("Got error: " + e.message); }); 

我试图http.get /post,但我不能把它们放在app.get函数内?

我现在说这个答案来得相当晚,但如果您将Expressjsapi-gateway一起使用,则会有一个新的模块, aws-serverless-express ,可用于将Express应用程序移植到Api-Gateway 。 你可以在这里find一个教程 !

如果你想要的只是redirect用户,那么只需改变你的代码使用res.redirect('www.google.com'); 正如卢卡斯在回答中所提到的那样。

 var app = express(); app.get('/test', function(req, res) { res.redirect('www.google.com'); }; 

如果你想要什么,首先从另一个API获取数据,然后显示给用户,我会build议使用请求模块,这是经过testing,使您的代码看起来更干净。 另一方面,使用nodejs的核心http模块确实让你的代码“更轻”。

随着请求模块,你会有

 var app = express(); var request = require('request'); app.get('/test', function(req, res) { var options = { method: 'GET', url: 'www.google.com', } request(options, function(err, response, body) { if (err) { return res.status(500).end(); } res.send(body); // send whatever you want here }); }; 

现在你试图定义variablesreq ,但是这里的问题是这个variables表示服务器(这个代码)收到的请求。 由于它已经被服务器发送和捕获,所以你不能改变它,这是客户端发给你的。

如果我正确地理解了你,你希望这个服务器作为一个中央的“API代理”,在那里它接收请求,并用来自其他各种API的数据进行响应。

所以我们无法做任何要求,但我们可以用res来回应客户。 为此,创build一个类似于你所拥有的http.get请求,从中获取数据,然后在callback中使用res.send(data);

看看快速文档,他们是非常有帮助的。 而且,如果您只是试图将客户端redirect到另一个页面,则有res.redirect ,这非常有用。 http://expressjs.com/en/api.html#res.redirect

编辑:这是我正在谈论的一个例子编辑2:修正了真正的代码运行的伪代码

 app.get('/test', function(req, rootRes){ var options = { host: 'jsonplaceholder.typicode.com', port: 80, path: '/users' }; http.get(options, function(res) { console.log("Got response: " + res.statusCode); var theData = ''; res.on('data', function(body){ theData += body; }); res.on('end',function(){ console.log(theData); if(res.statusCode < 399) { rootRes.send(200,theData); //send a success code with the data }else{ rootRes.send(res.statusCode); //send the client whatever error the server experienced } }); }).on('error', function(e) { console.log("Got error: " + e.message); rootRes.send(501); //internal server error }); }); 

请注意,我在2分钟内写了这个,所以把这个作为伪代码,可能无法运行。 另外,查阅有关处理状态代码和正确实践的文档。

使用http-proxy lib可以很容易地使用Express.js代理:

 let app = require('express')(); var httpProxy = require('http-proxy'); var apiProxy = httpProxy.createProxyServer(); app.get("/*", function(req, res){ apiProxy.web(req, res, { target: 'http://google.com' }); }); 

另一个变体是使用基于configuration的方法与express-gateway

全球安装npm i -g express-gateway
执行eg gateway create来创build示例项目

在创build的目录里面打开config/gateway.config.yml文件并粘贴下面的configuration:

 http: port: 8080 apiEndpoints: api: host: localhost paths: '/*' serviceEndpoints: google: url: 'https://google.com' policies: - proxy pipelines: - name: default apiEndpoints: - api policies: - proxy: - action: serviceEndpoint: google changeOrigin: true 

这里是入门指南: http : //www.express-gateway.io/getting-started/