簡體   English   中英

使用Node.js的服務器端代理

[英]Server Side Proxy using Node.js

我正在嘗試創建一個Web應用程序,該應用程序必須對CDAP服務器進行REST調用。 當我嘗試使用典型的jQuery / AJAX時,由於明顯的原因(這將是跨域請求),我遇到了CORS / Access-Control-Allow-Origin問題。 遺憾的是,CDAP不支持CORS。

現在,唯一剩下的選擇就是創建服務器端代理。 以下是設置:

  • Nodejs為來自瀏覽器的所有調用公開通用端點(/ rest / *)。
  • 瀏覽器對cdap資源的節點代理進行所有調用。

以下是瀏覽器,Nodejs代理和CDAP之間的控制流程,

  • 瀏覽器
    • 對節點代理進行(http)調用。
  • Nodejs服務器
    • 接收來自瀏覽器的http調用,並適當地更改url以向CDAP后端發出相同的請求。
    • 從CDAP獲得對以上請求的響應,並將其路由回客戶端。

Node.js代理在本地主機上運行:8500

CDAP實例正在localhost:10000運行

瀏覽器:

Node.js代理:

該REST調用的curl等效項如下:

curl -v本地主機:10000 / v3 /命名空間/ default / apps / S3Text -H“內容類型: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');

如果您願意使用某些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);
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM