2013-05-28 39 views
7

Tôi đang viết một ứng dụng với Angular.js và Node.js.Sử dụng Node.JS làm máy chủ REST và máy chủ web

Có một ứng dụng phía máy khách được viết bằng HTML & Angular.js cần một máy chủ web như Apache trực tuyến.

Ngoài ra còn có dịch vụ web REST phía máy chủ được viết bằng Node.js, được xây dựng trên restify (nhưng tôi không quan tâm REST API nào tôi sử dụng, tôi có thể sử dụng một API khác).

Tôi có thể sử dụng máy chủ Node.js cho REST webservice và một máy chủ Node.js khác để phục vụ ứng dụng web phía máy khách. Nhưng tôi muốn có chỉ một máy chủ Node.js chạy, trên một URL/cổng (để ngăn các yêu cầu AJAX tên miền chéo).

Tôi làm như thế nào?

+0

Bạn chỉ có thể có trình đánh giá cấp cao nhất trong URL để định tuyến yêu cầu cho một ứng dụng hoặc ứng dụng khác. Hoặc người nào khác sử dụng tên máy chủ ảo để tách hai (có thể làm phức tạp mọi thứ nếu ứng dụng khách cần truy cập vào các dịch vụ REST, tôi đoán). – Pointy

+0

@Pointy Có nhưng nó có vẻ giống như thủ đoạn với tôi. Tôi muốn tìm một giải pháp tốt cho việc này (chỉ một máy chủ). Tôi đã quen với PHP và các ngôn ngữ phía máy chủ khác và với chúng, bạn có máy chủ web cung cấp các tệp tĩnh * và * thực thi các tập lệnh phía máy chủ. Vì vậy, tôi đang cố gắng để có cùng với JS. –

+0

Cách này hay cách khác, máy chủ đơn sẽ phải kiểm tra các yêu cầu HTTP đến để quyết định ứng dụng nào sẽ xử lý nó. Để làm điều đó, nó có thể nhìn vào tên máy chủ, số cổng hoặc đường dẫn yêu cầu. – Pointy

Trả lời

5

Không chắc chắn nếu điều này có thể áp dụng cho vấn đề hiện tại của bạn - nhưng app.use() trong Express có thể cho phép một ứng dụng chính đặt các ứng dụng con để xử lý các tiền tố tuyến khác nhau. Vì vậy, bạn có thể có điểm ứng dụng chính của mình bất kỳ yêu cầu nào bắt đầu bằng /store/ cho một ứng dụng Express và mọi yêu cầu đến /app/ bằng ứng dụng Express thứ hai.

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

+0

Hoàn hảo, tôi không biết về thể hiện nhưng có vẻ như làm những gì tôi đang tìm kiếm. Cảm ơn –

6

Bạn có thể sử dụng proxy trước Nodej. Fastest nginx

Ví dụ (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

Tôi không muốn sử dụng NGinx. Tôi chỉ muốn có một máy chủ Node.JS. –

+0

Hãy xem [topic] này (http://stackoverflow.com/a/9981974/1853887) –

+0

Tôi không thực sự quan tâm đến buổi biểu diễn. Ứng dụng này là một wiki. Mọi người cài đặt wiki sẽ cần Node.JS. Tôi không muốn làm cho họ cài đặt Nginx và cấu hình nó quá. –

2

Bạn muốn phục vụ cho cả ứng dụng phía client và API từ cùng một URL ...

(to prevent cross-domain AJAX requests).

Tại sao? Điều này không quy mô và đi ngược lại các tiêu chuẩn API an toàn. Cuối cùng, bạn sẽ muốn hỗ trợ CORS vì việc quảng cáo toàn cầu sẽ sớm có mặt trong năm tới với các bản phát hành IE11 và IE12 mới. JSONP có thể là dự phòng cho đến khi chúng phát triển.

Không có gì sai với cross-domain AJAX requests và gần đây được khuyến khích --- do đó việc áp dụng rộng rãi quy ước này.

Và nếu bạn thực sự cần phải hạn chế yêu cầu API tên miền chéo, chỉ cần thêm danh sách trắng các tên miền bạn muốn cấp quyền truy cập vào máy chủ nút --- dễ dàng như vậy.

Bạn muốn phục vụ cho cả ứng dụng phía client và API từ cùng một cổng ...

  1. Proxy server nút vượt qua trên api.domain.com qua nginx.

  2. Chuyển ứng dụng phía máy khách sang gốc tài liệu tĩnh trong NGINX.

Bây giờ cả hai đều đang ngồi trên PORT 80 và chỉ một máy chủ nút đang được sử dụng.

+0

Tôi muốn một cái gì đó đơn giản để thiết lập. Ứng dụng này là một wiki. Tôi muốn mọi người cài đặt Nodejs, kích hoạt một máy chủ thông qua Node và được thực hiện với nó. Không Nginx. Và tôi đã luôn luôn sử dụng một điểm cuối trong tất cả các phát triển khác của tôi (PHP, ruby, ...). Tôi không thấy lý do tại sao tôi nên bận tâm bây giờ để có 2 máy chủ cho một cái gì đó rất đơn giản như một webapp nhỏ ... Tôi không cần khả năng mở rộng. –

+0

@MatthieuNapoli NGINX proxy pass là một thiết lập cực kỳ đơn giản, phổ biến, cũng là thông lệ phổ biến. Nó xả rác mất 5 phút. Không phải đề cập đến bây giờ bạn có thể ném ứng dụng phía khách hàng của bạn lên trên một CDN với CORS kích hoạt, do đó bạn thậm chí không cần phải lưu trữ nó trên hộp của riêng bạn nếu bạn không muốn quá. –

+0

Tôi thấy rằng nó không phải là một cấu hình phức tạp, nhưng hiểu rằng đối với một người dùng cuối, phải cài đặt NodeJS + Nginx + cấu hình Nginux chỉ để có một wiki lăn, nó không phải là rất hấp dẫn. –

Các vấn đề liên quan