2013-05-28 161 views
7

我正在用Angular.js和Node.js編寫應用程序。使用Node.JS作爲REST服務器和Web服務器

有一個客戶端應用程序用HTML編寫& Angular.js需要像Apache這樣的Web服務器才能聯機。

還有寫在Node.js的一個服務器端REST Web服務,建立在restify(但我不在乎我用,我可以用另外一個這REST API)。

我可以使用REST web服務的Node.js服務器和服務客戶​​端webapp的另一個Node.js服務器來完成整個工作。但是我希望只有一個Node.js服務器在一個URL /端口上運行(以防止跨域AJAX請求)。

我該怎麼做?

+0

您可以直接在你的URL頂級預選賽將請求路由到一個應用程序或其他。或者使用虛擬主機名將這兩個分開(如果客戶端應用程序需要到達REST服務,這可能會使事情複雜化,我猜)。 – Pointy

+0

@Pointy是的,但它似乎對我來說很詭計。我寧願找到一個好的解決方案(僅限一臺服務器)。我習慣於使用PHP和其他服務器端語言,並且使用它們的Web服務器提供靜態文件*和*執行服務器端腳本。所以我想和JS一樣。 –

+0

好吧,單個服務器必須檢查傳入的HTTP請求以決定哪個應用程序應該處理它。爲此,它可以查看主機名,端口號或請求路徑。 – Pointy

回答

5

不確定這是否適用於您當前的問題 - 但app.use()在Express中可以讓一個主應用程序設置子應用程序來處理不同的路由前綴。因此,您可以讓主要應用程序將任何以/store/開頭的請求指向一個Express應用程序,以及使用第二個Express應用程序請求/app/

http://expressjs.com/api.html#app.use

+0

完美,我不知道快遞,但它似乎做我正在尋找。謝謝 –

6

您可以在Nodejs之前使用代理。 Fastest nginx

實例(Nginx的):

server { 
    listen 80; 
    server_name example.com 

    # Only http://example.com/api/~ 
    location /api/ { 
     proxy_pass http://localhost:8000; # node.js app 
     proxy_redirect  off; 
     proxy_set_header Host    $host; 
     proxy_set_header X-Real-IP  $remote_addr; 
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    } 

    location ~* \.(jpg|jpeg|gif|png|css|js|json|woff|zip|tgz|gz|swf|ico|txt|xml)$ { 
     expires max; 
     root /var/www/site_path; 
    } 
} 
+0

我不想使用NGinx。我只想要一個Node.JS服務器。 –

+0

看看這個[主題](http://stackoverflow.com/a/9981974/1853887) –

+0

我真的不關心表演。該應用程序是一個維基。安裝wiki的人需要Node.JS.我不想讓他們安裝Nginx並進行配置。 –

2

你要爲來自同一個URL既客戶端應用程序和API ...

(to prevent cross-domain AJAX requests).

爲什麼?這不會擴展並且違背標準的restful API impliment。最終你會想要支持CORS,因爲最早在IE11和IE12推出的時候,通用推廣將在明年推出。 JSONP可以是一個後備,直到他們獲得成功。

cross-domain AJAX requests並沒有錯,最近被鼓勵---因此這個公約被廣泛採用。

如果您確實需要限制跨域API請求,只需在您的節點服務器上將您想要授予訪問權限的域列入白名單即可。

你想通過NGINX來自同一個端口既服務客戶端應用程序和API ...在api.domain.com

  1. 代理通過節點服務器。

  2. 將客戶端應用程序移動到NGINX下的靜態文檔根目錄下。

現在兩者都坐在PORT 80上,並且只使用一個節點服務器。

+0

我想要一些簡單的設置。該應用程序是一個維基。我希望人們安裝Nodejs,通過Node激發一臺服務器並完成它。沒有Nginx。我在其他開發中總是使用一個端點(PHP,ruby,...)。我不明白爲什麼我現在應該打擾2臺服務器的功能如此簡單,就像一個小型Web應用程序一樣......我不需要可擴展性。 –

+0

@MatthieuNapoli NGINX proxy pass是一個非常簡單,常見的設置,也是常見的做法。它枯燥地需要5分鐘。更不用說現在你可以把你的客戶端應用程序放在啓用CORS的CDN上,所以你甚至不需要在自己的盒子上託管它,如果你不想要的話。 –

+0

我發現這不是一個複雜的配置,但是要理解,對於最終用戶而言,必須安裝NodeJS + Nginx +配置Nginux才能讓wiki進行滾動,這不是很有吸引力。 –