我正在尝试创建一个简单的API网关类型项目,该项目接收传入路由并将其重定向到其他外部api。我尝试使用/test
的传入路线访问google.com或任何其他API以及某些请求,但我不认为我做得对。
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函数中?
答案 0 :(得分:1)
我现在这个答案来得相当晚,但如果您将Expressjs
与api-gateway
结合使用,则会有一个新模块aws-serverless-express可用于移植Express
Api-Gateway
1}} app到res.redirect('www.google.com');
。你可以在这里找到tutorial!
如果您想要的只是重定向用户,那么只需将代码更改为使用var app = express();
app.get('/test', function(req, res) {
res.redirect('www.google.com');
};
,就像Lucas在回答中提到的那样。
nodejs
如果你想要什么,首先从另一个API获取数据,然后将其显示给用户,我建议使用request模块,该模块经过实战测试,使您的代码看起来更清晰。
另一方面,使用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
});
};
模块确实可以使您的代码更轻松#34;
使用请求模块
{{1}}
答案 1 :(得分:0)
现在您正在尝试定义变量req
,但问题是此变量表示服务器(此代码)收到的请求。由于它已经被服务器发送和捕获,因此您无法更改它,这是客户端发送给您的。
如果我理解正确,您希望此服务器充当一种中央“API代理”,它接收请求,并使用来自各种其他API的数据进行响应。
因此我们无法对req
执行任何操作,但我们可以使用res
回复客户端。为此,请创建一个类似于您的请求的http.get
请求,从中捕获数据,然后在回调中使用res.send(data);
看一下Express文档,它们非常有用。同样,如果您只是尝试将客户端重定向到另一个页面,则会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分钟内写了这个,所以把它作为可能无法运行的伪代码。此外,查找有关处理状态代码和正确练习的文档。
答案 2 :(得分:0)
使用Express {js代理可以使用http-proxy
lib:
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' });
});
另一种变体是使用基于配置的方法和express-gateway
库
全球安装npm i -g express-gateway
执行eg gateway create
以创建示例项目
在创建的目录中打开config/gateway.config.yml
文件并粘贴以下配置:
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