节点,Express API网关

时间:2016-05-23 20:27:44

标签: node.js express url-routing

我正在尝试创建一个简单的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函数中?

3 个答案:

答案 0 :(得分:1)

我现在这个答案来得相当晚,但如果您将Expressjsapi-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

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