9

我正在用 Angular.js 和 Node.js 编写一个应用程序。

有一个用 HTML 和 Angular.js 编写的客户端应用程序,需要像 Apache 这样的网络服务器才能在线。

还有一个用 Node.js 编写的服务器端 REST Web 服务restify,建立在(但我不在乎我使用哪个 REST API,我可以使用另一个)。

我可以使用用于 REST Web 服务的 Node.js 服务器和另一个用于服务客户端 Web 应用程序的 Node.js 服务器来完成整个工作。但我只想在一个 URL/端口上运行一个 Node.js 服务器(以防止跨域 AJAX 请求)。

我该怎么做?

4

3 回答 3

8

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

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

于 2013-05-28T22:18:34.740 回答
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;
    }
}
于 2013-05-28T19:29:23.237 回答
2

您想从同一个 URL 为客户端应用程序和 API 提供服务...

(to prevent cross-domain AJAX requests).

为什么?这不能扩展并且违背了标准的 RESTful API 实现。最终,您将希望支持 CORS,因为最早将在明年推出新的 IE11 和 IE12,从而实现普遍适应。JSONP 在它们出现之前可以作为后备。

没有错,cross-domain AJAX requests最近也受到鼓励——因此该公约被广泛采用。

如果您确实需要限制跨域 API 请求,只需将您想要在节点服务器下授予访问权限的域列入白名单 --- 就这么简单。

您想从同一端口同时提供客户端应用程序和 API ...

  1. 通过 NGINX 在 api.domain.com 上代理传递节点服务器。

  2. 将客户端应用程序移动到 NGINX 下的静态文档根目录。

现在两者都坐在 PORT 80 上,并且只使用了一个节点服务器。

于 2013-05-28T20:20:47.103 回答