2014-02-09 42 views
1

我正在開發一個小型web應用程序,通常使用相對複雜的流程構建,然後部署到WebLogic。如何編寫提供大多數本地文件的節點快速應用程序,但將某些節點重新路由到另一個域?

但是,我正在使用的部分是使用AngularJS,並且都是HTML和Javascript。它通常會將ajax調用到同一個域中的另一個webapp。爲了縮短我的開發週期,我想避免構建過程並重新加載瀏覽器頁面。

我想我可以用「節點快車」來做到這一點,但細節逃避了我。我已經設法定義了一個非常簡單的應用程序,只是提供本地文件,但現在我必須弄清楚如何檢測某些路徑以匹配表達式,並將這些請求重新路由到對外部域的請求。

因此,如果它獲得「/diag/stuff.html」,「/foo/thing.html」或「/index.html」的請求,它將發回匹配相同路徑的文件。但是,如果路徑匹配「/fooService/.*」,那麼我必須將GET的響應發送回相同的路徑,但在不同的主機和端口上。

這是迄今爲止我的瑣碎的應用程序:

var express = require('express'); 
var app = express(); 

app.use("/", express.static(__dirname)); 

app.listen(8000); 

更新:

我喜歡代理的想法,所以我做了本地安裝的「HTTP代理」(我忘了和第一沒有一個全球性的安裝),然後改劇本這樣:

var express = require('express'); 
var app = express(); 
var httpProxy = require('http-proxy'); 
var proxy = new httpProxy.RoutingProxy(); 

app.use("/", express.static(__dirname)); 

app.get('/FooService/*', function(req, res) { 
    "use strict"; 
    return proxy.proxyRequest(req, res, { 
    host: "foohost.net", 
    port: 80 
    }); 
}); 

app.listen(8000); 

這種失敗:

<path>\server.js:4 
var proxy = new httpProxy.RoutingProxy(); 
     ^
TypeError: undefined is not a function 
at Object.<anonymous> (<path>\server.js:4:13) 

這裏可能有什麼問題?

更新:

難道是看到的內容有用 「的console.log(HTTPPROXY)」 之後的 「規定」?:

function ProxyServer(options) { 
    EE3.call(this); 

    this.web = this.proxyRequest   = createRightProxy('web')(options); 
    this.ws = this.proxyWebsocketRequest = createRightProxy('ws')(options); 
    this.options = options; 

    this.webPasses = Object.keys(web).map(function(pass) { 
return web[pass]; 
    }); 

    this.wsPasses = Object.keys(ws).map(function(pass) { 
return ws[pass]; 
    }); 

    this.on('error', this.onError.bind(this)); 

} 

這是否提出爲何線索「新的httpProxy.RoutingProxy()」說它是未定義的?

回答

6

您可以使用http-proxy並轉發請求到不同的主機。要安裝http-proxy,您需要運行sudo npm install http-proxy。將處理代理將看起來像代碼:

httpProxy = require('http-proxy'); 
proxy = new httpProxy.RoutingProxy(); 
(...) 
app.get('/fooService/*', function (request, response) { 
    "use strict"; 
    return proxy.proxyRequest(request, response, { 
     host : externalHost, 
     port : 80 
    }); 
}); 

UPDATE

上面的代碼工作http-proxy〜0.10.x。從那時起,很多東西在圖書館中發生了變化。下面你可以(在寫作時〜1.0.2)找到例如新版本:

var httpProxy = require('http-proxy'), 
    proxy = httpProxy.createProxyServer({}); 
(...) 
app.get('/fooService/*', function (request, response) { 
    "use strict"; 
    return proxy.web(request, response, { 
     target: 'http://fooservice.com' 
    }); 
}); 
+0

這似乎是最好的方式,但我無法得到它的工作。這在「new httpProxy.RoutingProxy()」行失敗,說「未定義不是函數」。 –

+0

我已將示例更新到新庫版 –

+0

Hot dang。這工作。如果我只想透明地代理所有請求,而不僅僅是GET方法調用,我認爲將「app.get」更改爲「app.all」是合理的?例如,在代理POST的回調中,我有什麼不同嗎? –

0

如果重定向滿足你的需求,那麼這就是最簡單的解決方案:

var express = require('express'); 

var app = express(); 

app.use(express.static(__dirname + '/public')); 
app.use(app.router); 

app.get('/fooService/*', function(req, res){ 
    res.redirect(302, 'http://otherdomain.com:2222' + req.path); 
}); 

app.listen(8000); 

注意,它通常被認爲爲您的靜態文件使用子目錄的好習慣(如上面的public)。否則,您可以查看您的應用程序文件本身以及您在應用程序根目錄中保存的任何內容

+0

我會試試這個。你有關於子目錄的建議被採用,但這不是一個節點應用程序。我只是將它用作縮短我的開發週期的工具。 –

+0

瞭解,但我仍然覺得你最好的選擇是將你公開發布的文件放在子目錄中。這只是一種良好的做法,並不像是很難......只需製作一個子目錄並將其放入其中即可。祝你好運!讓我知道重定向是否有效。 –

+0

嗯,我不確定它的工作。當我使用命令行中的「wget」通過應該重定向的路徑調用服務器地址時,它給了我一個從重定向到服務器的結果。然而,我的angularjs應用程序中的行爲仍然令人困惑。在Firebug中,我看到了302,然後是200,然後在我的$ https錯誤方法中找到了斷點,顯示了404。我很困惑。 –

相關問題