2013-05-28 11 views
7

Piszę aplikację z Angular.js i Node.js.Użyj Node.JS jako serwera REST i serwera WWW

Istnieje aplikacja klienta po stronie klienta napisana w HTML & Angular.js, która potrzebuje serwera WWW, takiego jak Apache, aby być online.

Istnieje również REST server-side usługa napisany w node.js, zbudowany na restify (ale nie dbam który REST API używam, mogę użyć innego).

Mogę uzyskać wszystko działa przy użyciu serwera Node.js dla usługi sieciowej REST i innego serwera Node.js do obsługi aplikacji webowej po stronie klienta. Ale chciałbym mieć tylko jeden serwer Node.js z numerem na jednym adresie URL/port (aby zapobiec żądaniom AJAX między domenami).

Jak mogę to zrobić?

+0

Można tylko mieć kwalifikator najwyższego poziomu w adresach URL żądań do jednej aplikacji lub inne. Albo użyj nazwy hosta wirtualnego, aby oddzielić te dwa elementy (co może komplikować sytuację, jeśli aplikacja kliencka musi dostać się do usług REST, jak sądzę). – Pointy

+0

@Pointy Tak, ale wydaje mi się, że są to sztuczki. Wolałbym znaleźć dla tego dobre rozwiązanie (tylko jeden serwer). Jestem przyzwyczajony do PHP i innych języków po stronie serwera, a wraz z nimi masz serwer dostarczający pliki statyczne * i * wykonujące skrypty po stronie serwera. Więc próbuję mieć to samo z JS. –

+0

Tak czy inaczej, pojedynczy serwer będzie musiał zbadać przychodzące żądania HTTP, aby zdecydować, która aplikacja powinna go obsłużyć. Aby to zrobić, może spojrzeć na nazwę hosta, numer portu lub ścieżkę żądania. – Pointy

Odpowiedz

5

Nie jestem pewien, czy ma to zastosowanie do bieżącego problemu - ale app.use() w Expressie może pozwolić jednej aplikacji podrzędnej aplikacji głównej na obsługę różnych prefiksów tras. Więc możesz mieć swój główny punkt aplikacji dla każdego żądania rozpoczynającego się od /store/ do jednej aplikacji ekspresowej i wszelkich żądań do /app/ z drugą aplikacją Express.

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

+0

Doskonale, nie wiedziałem o ekspresie, ale wydaje mi się, że robię to, czego szukałem. Dzięki –

6

Możesz użyć proxy przed Nodejsem. Fastest nginx

Przykład (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

Nie chcę używać NGinx. Chcę tylko jeden serwer Node.JS. –

+0

Spójrz na ten [temat] (http://stackoverflow.com/a/9981974/1853887) –

+0

Nie interesują mnie spektakle. Ta aplikacja to wiki. Osoby instalujące wiki będą potrzebować Node.JS. Nie chcę, aby instalowały Nginx i konfigurowały go. –

2

chcesz służyć zarówno aplikacji po stronie klienta i API z samej zawartości ...

(to prevent cross-domain AJAX requests).

Dlaczego? To nie jest skalowalne i jest sprzeczne ze standardowymi, restrykcyjnymi implikacjami interfejsu API. Ostatecznie będziesz chciał wspierać CORS, ponieważ uniwersalna adpacja będzie dostępna już w przyszłym roku dzięki nowym wersjom IE11 i IE12. JSONP może być awarią, dopóki nie powstanie.

Nie ma nic złego w cross-domain AJAX requests i są ostatnio zachęcane - stąd powszechne przyjęcie tej konwencji.

A jeśli naprawdę potrzebujesz ograniczyć żądania interfejsu API w wielu domenach, po prostu dodaj do białej listy domeny, którym chcesz przyznać dostęp również pod swoim serwerem węzłowym - tak proste.

chcesz służyć zarówno aplikacji po stronie klienta i API od samego portu ...

  1. serwer Proxy przejścia węzłem api.domain.com przez Nginx.

  2. Przenieś aplikację po stronie klienta do katalogu głównego dokumentu w NGINX.

Teraz oba znajdują się na PORT 80, a używany jest tylko jeden serwer węzłowy.

+0

Chcę coś prostego w konfiguracji. Ta aplikacja to wiki. Chcę, żeby ludzie zainstalowali Nodejs, wystrzeliwszy jeden serwer przez Węzeł i skończcie z nim. Bez Nginx. I zawsze używałem jednego punktu końcowego we wszystkich moich innych projektach (PHP, Ruby, ...). Nie widzę powodu, dla którego powinienem teraz zajmować się 2 serwerami za coś tak prostego, jak mały webapp ... Nie potrzebuję skalowalności. –

+0

@MatthieuNapoli NGINX proxy pass to niezwykle prosta, powszechna konfiguracja, również powszechna praktyka. Trwa to 5 minut. Nie wspominając już teraz, możesz wrzucić aplikację po stronie klienta do CDN z włączonym CORS, więc nie musisz nawet hostować go na swoim własnym komputerze, jeśli tego nie chcesz. –

+0

Widzę, że nie jest to skomplikowana konfiguracja, ale rozumiem, że dla użytkownika końcowego, konieczności instalacji NodeJS + Nginx + skonfigurować Nginux tylko do toczenia wiki, nie jest zbyt atrakcyjna. –

Powiązane problemy