2013-05-28 165 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进行滚动,这不是很有吸引力。 –