13

我在 angularjs 和 nodejs 中有 Moto Adverts 应用程序。Angularjs-client-side 在 Apache HTTP Server (localhost:8000) 上运行,但 nodejs-server-side 作为 node.js http 服务器 (localhost:3000) 运行。

一段客户端代码(angularjs):

var motoAdsServices = angular.module('motoAdsServices', ['ngResource']);

motoAdsServices.factory('Brand', ['$resource', function($resource) {
    return $resource('http://localhost\\:3000/api/:id', {}, {
      query: {
        method: 'GET',
        params: {
          id: 'brands'
        },
        isArray: true
      }
    });
  }]);

一段服务器端代码(nodejs):

var express = require('express');
var path = require('path');
var http = require('http');
var brands = require('./routes/brands');

var app = express();

var allowCrossDomain = function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "X-Requested-With");
  next();
};

app.configure(function() {
  app.set('port', process.env.PORT || 3000);
  app.use(express.logger('dev'));  /* 'default', 'short', 'tiny', 'dev' */
  app.use(express.bodyParser()),
  app.use(allowCrossDomain);
  app.use(express.static(path.join(__dirname, 'public')));
});

app.get('/api/brands', brands.findAll);

http.createServer(app).listen(app.get('port'), function() {
  console.log("Express server listening on port " + app.get('port'));
});

我的问题是:

  1. 我应该怎么做才能在同一台服务器上运行客户端和服务器端。a) 在 Apache HTTP 服务器 (localhost:8000) 上。b) 在 (localhost:3000) 上的 Node.js 自我 http 服务器上。
  2. 哪种架构最适合生产使用 - 客户端和服务器端有两个独立的服务器,还是只有一个?
  3. 在服务器端使用跨域资源共享 (CORS) 是一种好习惯(如果我应该有两个独立的服务器)?
  4. 我应该怎么做才能不将http://localhost:3000/api/brands硬编码到服务器端(最佳实践)?
4

3 回答 3

13
  1. 节点.js
  2. 一台服务器将更易于维护。如果需要,您可以稍后使用 nginx 缓存静态文件以进行优化。(只需搜索“nginx Node.js static”,但如果您的流量较小且没有大量静态文件,则它可以正常工作)。我不会将 Apache 用于任何事情。

这是一个示例 nginx 配置:

server {
  listen 80;
  server_name myserver.net;

  root /mnt/app;
  index index.html index.htm;

  location /static/ {
       try_files $uri $uri/ =404;
  }

  location /api/ {
       proxy_pass http://127.0.0.1:8080;
  }
}
  1. 你不需要一个CORS。
  2. 端口将相同,因此这不是问题。
于 2015-09-26T08:33:09.707 回答
12

我相信这是 apache nodejs angularjs 最流行的架构。

在此处输入图像描述

(一)图中。

正如我在图中所写的那样,我建议您通过 nodejs 服务器提供所有文件,包括静态文件。另一方面,您可以仅将节点服务器用于动态内容,并使用 apache 来提供静态文件,包括您的客户端代码(如果您愿意)。但是如果你这样做了,即使你开发你的应用程序,你也总是需要 apache 服务器。我觉得会很麻烦。

(B) 图中。

您可以通过将它们定位在public目录中来提供包括其他静态文件在内的客户端代码。如果您决定从 nodejs 服务器提供所有文件,则可以在没有 apache 的情况下进行开发,并避免在代码中编写特定的端口号。我认为您的应用程序代码不应该意识到您将使用的端口号。

我希望这可以回答你所有的问题。

于 2015-09-30T05:46:48.413 回答
6

我应该怎么做才能在同一台服务器上运行客户端和服务器端。a) 在 Apache HTTP 服务器 (localhost:8000) 上。b) 在 (localhost:3000) 上的 Node.js 自我 http 服务器上。

Ans : 您不需要将 nodejs 作为自托管运行。而是通过 Apache 服务器运行 nodejs 并使用融合乘客。fusion 乘客将永远在后台运行您的节点应用程序。就我个人而言,我更喜欢 Nginx + fusion 用于我的 nodejs 应用程序。

哪种架构最适合生产使用 - 客户端和服务器端有两个独立的服务器,还是只有一个?

Ans : 我不明白你的意思是有两台服务器,一台用于客户端,一台用于服务器端。将您的客户端和服务器代码保存在单个服务器上。

在服务器端使用跨域资源共享 (CORS) 是一种好习惯(如果我应该有两个独立的服务器)?

Ans : 如果您的服务器和您的客户端在同一个域下,那么您无需担心 CORS,但如果将来您想将您的 API 公开给您的任何客户端应用程序,那么您将需要进行 CORS 配置。

我应该怎么做才能不将http://localhost:3000/api/brands硬编码到服务器端(最佳实践)?

Ans : 我使用常量来声明我的基本路径,然后在我的服务和工厂中执行 DI 来进行 API 调用。

motoAdsServices.constant("API", {
        "endpoint": "http://localhost:8080",
    })

motoAdsServices.factory('Brand', ['$resource','API', function($resource,API) {
    return $resource(API.endpoint + '/api/:id', {}, {
      query: {
        method: 'GET',
        params: {
          id: 'brands'
        },
        isArray: true
      }
    });
  }]);
于 2015-09-30T02:59:29.970 回答