使用Node.JS作为REST服务器和Web服务器。

9
我正在使用Angular.js和Node.js编写一个应用程序。
客户端应用程序是使用HTML和Angular.js编写的,需要像Apache这样的Web服务器在线上运行。
另外,我还编写了一个基于Node.js的服务器端REST webservice,构建在restify之上(但我不关心使用哪种REST API,我可以使用其他的)。
我可以使用一个Node.js服务器来运行整个应用程序,既可以处理REST webservice,也可以为客户端Web应用程序提供服务。但是,我希望只有一个Node.js服务器在一个URL/端口上运行(以防止跨域AJAX请求)。
我该怎么做呢?

你可以在URL中只使用顶级限定符来将请求路由到一个应用程序或另一个应用程序。否则,使用虚拟主机名来区分这两个应用程序(如果客户端应用程序需要访问REST服务,则可能会使事情变得复杂,我猜)。 - Pointy
@Pointy 是的,但这对我来说似乎是一种技巧。我宁愿为此找到一个好的解决方案(仅限一个服务器)。我习惯于使用PHP和其他服务器端语言,在它们中,Web服务器提供静态文件执行服务器端脚本。因此,我正在尝试在JS中实现相同的功能。 - Matthieu Napoli
无论如何,单个服务器都必须检查传入的HTTP请求以确定哪个应用程序应该处理它。为此,它可以查看主机名、端口号或请求路径。 - Pointy
3个回答

8
不确定这是否适用于您当前的问题 - 但是在Express中,app.use()可以让一个主应用程序设置子应用程序以处理不同的路由前缀。因此,您可以使主应用程序指向任何以/store/开头的请求到一个Express应用程序,并将任何请求发送到第二个Express应用程序以/app/开头。

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


很好,我不知道有Express这个东西,但是它看起来能够满足我的需求。谢谢。 - Matthieu Napoli

5

在Nodejs之前,您可以使用代理。 最快的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;
    }
}

我不想使用NGinx,我只想要一个Node.JS服务器。 - Matthieu Napoli
我并不是特别关心性能。这个应用程序是一个维基百科。安装维基的人将需要Node.JS。我不想让他们安装Nginx并进行配置。 - Matthieu Napoli
@StanislavLomadurov 这导致应用程序性能变慢。加载时间减少了一半。 - Rakesh Chand

2
你想从同一个URL提供客户端应用程序和API服务...(为了防止跨域AJAX请求)。
为什么?这不利于标准的RESTful API实现,也不具备可扩展性。最终你会想要支持CORS,因为随着新的IE11和IE12的推出,通用适配将在明年早些时候到来。JSONP可以作为回退方案,直到它们到来。
进行跨域AJAX请求并没有什么问题,并且最近被鼓励使用 - 因此这种约定得到了广泛的采用。
如果你真的需要限制跨域API请求,只需在你的node服务器下列出你想要授权访问的域名即可 - 就这么简单。
你想从同一个端口提供客户端应用程序和API服务...
1.通过NGINX代理传递api.domain.com上的node服务器。 2.将客户端应用程序移动到NGINX下的静态文档根目录中。
现在两者都在80端口上运行,并且只使用了一个node服务器。

我想要一个简单的设置。这个应用程序是一个维基百科。我希望人们安装Nodejs,通过Node启动一个服务器,然后就完成了。不需要Nginx。在我所有其他开发中,我一直使用一个端点(PHP、Ruby等)。我不明白为什么现在为了一个简单的小型Web应用程序而要使用两个服务器... 我不需要可扩展性。 - Matthieu Napoli
@MatthieuNapoli NGINX代理传递是一种非常简单、常见的设置,也是常见的做法。它只需要5分钟。更不用说现在你可以将客户端应用程序放在启用CORS的CDN上,如果你不想在自己的服务器上托管它的话。 - Dan Kanze
我看到这不是一个复杂的配置,但要理解对于终端用户来说,安装NodeJS + Nginx + 配置Nginx只是为了运行Wiki并不是很吸引人。 - Matthieu Napoli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接