La meilleure architecture de déploiement pour l'application angularjs nodejs

j'ai de la Moto Annonces application angularjs et nodejs. Angularjs-client-side tourne sur le serveur HTTP Apache (localhost:8000) mais nodejs-server-side tourne en noeud.serveur http js (localhost: 3000).

morceau de code côté client (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
      }
    });
  }]);

morceau de code côté serveur (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'));
});

mes questions sont:

  1. Ce que je dois faire pour exécuter côté client et côté serveur sur le même serveur. a) sur le serveur HTTP Apache (localhost:8000). b) Sur le Nœud.js self serveur http activé (localhost: 3000).
  2. quelle architecture sera la meilleure pour l'utilisation de production - deux serveurs indépendants pour côté client et côté serveur ou un seul?
  3. est-ce une bonne pratique d'utiliser le partage de ressources Cross-origin (CORS) côté serveur (si je devrais avoir deux serveurs indépendants)?
  4. ce que je dois faire pour ne pas adresse de code http://localhost:3000/api/brands à côté du serveur (meilleure pratique)?
13
demandé sur lukpaw 2013-11-14 21:54:16

3 réponses

  1. Node.js
  2. un serveur sera plus maintenable. Pour optimiser, vous pouvez mettre en cache des fichiers statiques avec nginx plus tard si vous en avez besoin. (Il suffit de rechercher 'Nginx Node.js static ' mais il fonctionnera très bien sans cela si vous avez un trafic léger et pas une tonne de fichiers statiques). Je n'utiliserais pas Apache pour quoi que ce soit.

voici un exemple de Nginx config:

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. vous n'aurez pas besoin de CORS avec un.
  2. Les ports seront les mêmes, de sorte que n'est pas un problème.
13
répondu Jason Livesay 2015-09-30 13:01:25

je crois que c'est l'architecture la plus populaire pour apache nodejs angularjs.

enter image description here

(A) dans la figure.

je vous recommande de servir tous les fichiers y compris les fichiers statiques via le serveur nodejs comme je l'ai écrit dans ma figure. D'un autre côté, vous pouvez utiliser node server uniquement pour les contenus dynamiques et utiliser apache pour servir les fichiers statiques, y compris vos codes côté client si vous comme. Mais si vous le faites, vous avez toujours besoin du serveur apache même lorsque vous développez votre application. Je sens que va être gênant.

(B) dans la figure.

vous pouvez servir vos codes côté client, y compris d'autres fichiers statiques en les localisant dans le répertoire public . Si vous décidez de servir tous les fichiers du serveur nodejs, vous pouvez vous développer sans apache et éviter d'écrire un numéro de port spécifique dans votre code. Je pense que votre code d'application ne devrait pas être conscient du numéro de port que vous utiliserez.

j'espère que ceci pourrait être la réponse à toutes vos questions.

12
répondu yazaki 2015-09-30 06:28:23

Ce que je dois faire pour exécuter côté client et côté serveur sur le même serveur. a) sur le serveur HTTP Apache (localhost:8000). b) Sur le Nœud.js self serveur http activé (localhost: 3000).

Réponse : vous n'avez pas besoin d'exécuter nodejs comme auto-hébergé.au lieu de cela, lancez nodejs via le serveur Apache et utilisez fusion passenger aussi. fusion passenger s'occupera d'exécuter votre application de noeud en arrière-plan pour toujours. Personnellement, je préfère NGINX + fusion pour mon NodeJS applications.

quelle architecture sera la meilleure pour la production - deux serveurs indépendants pour côté client et côté serveur ou un seul?

Ans: Je ne comprends pas ce que vous voulez dire par deux serveurs un pour le client et un pour le côté serveur. Gardez votre code client et serveur sur un seul serveur.

est-il une bonne pratique d'utiliser une ressource d'origine croisée partager (CORS) côté serveur (si je devrais avoir deux serveurs indépendants)?

Ans: si votre serveur et votre client sont sous le même domaine, alors vous n'avez pas besoin de vous soucier de CORS mais si à l'avenir vous voulez exposer votre API à l'une de vos applications client, alors vous aurez besoin de faire des configurations CORS.

Ce que je dois faire pour ne pas coder en dur l'adresse http://localhost:3000/api/brands à côté du serveur (meilleure pratique)?

Ans: j'utilise constant pour déclarer mon chemin de base et puis faire le DI dans mes services et l'usine qui font les appels 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
      }
    });
  }]);
6
répondu maddygoround 2015-09-30 09:28:53