【问题标题】:Server Side Proxy using Node.js使用 Node.js 的服务器端代理
【发布时间】:2016-01-08 19:54:27
【问题描述】:

我正在尝试创建一个必须对 CDAP 服务器进行 REST 调用的 Web 应用程序。当我尝试使用典型的 jQuery/AJAX 时,我遇到了 CORS/Access-Control-Allow-Origin 问题,原因很明显,这将是一个跨域请求。遗憾的是,CDAP 不支持 CORS。

现在我剩下的唯一选择是创建一个服务器端代理。以下是设置:

  • Nodejs 为来自浏览器的所有调用公开了一个通用端点 (/rest/*)。
  • 浏览器对节点代理进行所有调用以获取 cdap 资源。

以下是浏览器、Nodejs代理和CDAP之间的控制流程,

  • 浏览器
    • 对节点代理进行 (http) 调用。
  • Nodejs 服务器
    • 接收来自浏览器的 http 调用并适当更改 url 以向 CDAP 后端发出相同的请求。
    • 从 CDAP 获取对上述请求的响应并将其路由回客户端。

Nodejs 代理在 localhost:8500 运行

CDAP 实例在 localhost:10000 运行

浏览器:

Nodejs 代理:

此 REST 调用的 curl 等效项如下:

curl -v localhost:10000/v3/namespaces/default/apps/S3Text -H "Content-Type: application/json" -d @new.json -X PUT

我是 Node.js 的新手,但已经阅读了一些文档并观看了一些视频。我卡住的地方是我需要加载 JSON 文件的哪一部分和其他参数,如方法、数据、dataType 等。它是在 JS 代码中还是在 Node.js 代理服务器代码中。如果它必须进入 nodeProxy.js 代码,那么我需要在哪里以及如何传递它们?如果我太天真了,我很抱歉。

JS代码:

function sendCurlRequest(){    
    var jsonData = <JSON_DATA>;
    $.ajax({
        cache : false,
        method: "PUT",
        crossDomain: true,
        url: 'http://localhost:8500/rest/v3/namespaces/default/apps/S3Text',
        data: jsonData,
        dataType: "json",
        contentType: "application/json",
        success: function(data){
                alert("Success");
        },
        error: function(data){
                alert("Error: " + JSON.stringify(data));
        },
        complete: function(data){
                console.log("Call Completed");
        }
    });
}

nodeProxy.js 代码:

var http = require('http');
var httpRequest = require('request');
var destinationURL = 'http://localhost:1000/v3/namespaces/default/apps/S3Text';

http.createServer(function (req, res) {
    var options = {
        url: destinationURL
    }
    var destinationResponse =   req.pipe(request(options))destinationResponse.pipe(res)
}).listen(8500, 'localhost');

console.log('Server running at http://localhost:8500');

【问题讨论】:

  • 我会尝试通过使用现成的代理来完成此任务,例如 NGINX (nginx.org/en) 并适当地配置它(如 nginx.com/resources/admin-guide/reverse-proxy 中所述)。这需要一点点学习,但 NGINX 就是为此而生的,所以应该不难。
  • @Adi Levin,谢谢,但我的组织不支持 NGINX。我想我只能使用 Node.js 来做到这一点。关于如何去做的任何想法?
  • 所以,让我看看我是否理解您的问题:您在客户端的发布请求中发送了某些数据和标头,并且您希望您的 NodeJS 后端发送相同的数据和标头作为对 CDAP 的发布请求,然后您想以相反的方式传回响应,对吗?
  • 实现起来并不难,但你也可以尝试使用现成的解决方案,例如github.com/nodejitsu/node-http-proxy

标签: javascript json node.js curl proxy


【解决方案1】:

如果您愿意使用一些 Node 模块,那么这可能会起作用,尽管我认为它不会将您的 URL 从 localhost:8500/rest/v3 更改为 localhost:10000/v3/rest/ 将留在里面。

JS

return $http.get("http://localhost:8500/rest/v3/namespaces/default/apps/S3Text")

return $http.post("http://localhost:8500/rest/v3/namespaces/default/apps/S3Text/other", availReqObj);

节点

var express = require('express');
var app = express();
var cors = require('cors');
var proxy = require('http-proxy-middleware');

var port = process.env.PORT || 8500;

app.use(express.static("" + __dirname));
app.use(cors());

app.use('/rest/v3/namespaces/default/apps/S3Text',
    proxy({target: "http://localhost:10000",
           changeOrigin: false,
           logLevel: 'debug'
          })
   );

app.use('/rest/v3/namespaces/default/apps/S3Text/other',
   proxy({target: "http://localhost:10000",
          changeOrigin: false,
          logLevel: 'debug'
         })
   );

app.listen(port, function() {
    console.log("Listening at " + port);
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-31
    • 1970-01-01
    • 1970-01-01
    • 2020-05-17
    • 2012-02-11
    • 1970-01-01
    • 2011-01-30
    相关资源
    最近更新 更多