我在angularjs和nodejs中有Moto Adverts应用程序。 Angularjs-client-side在Apache HTTP Server(localhost:8000)上运行,但nodejs-server-side以node.js http server(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'));
});
我的问题是:
答案 0 :(得分:13)
以下是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 :(得分:12)
我相信这是apache nodejs angularjs最流行的架构。
我建议您通过nodejs服务器提供包括静态文件在内的所有文件,就像我在图中所写的那样。 另一方面,您可以仅将节点服务器用于动态内容,并根据需要使用apache来提供包括客户端代码在内的静态文件。 但是如果你这样做,即使你开发应用程序,也需要apache服务器。我觉得这很麻烦。
您可以通过在public
目录中找到包含其他静态文件的客户端代码来提供服务。
如果您决定从nodejs服务器提供所有文件,则可以在不使用apache的情况下进行开发,并避免在代码中编写特定的端口号。
我认为您的应用程序代码不应该关注您将使用的端口号。
我希望这可以解答你的所有问题。
答案 2 :(得分:6)
在同一台服务器上运行客户端和服务器端应该怎么做。 a)在Apache HTTP Server上(localhost:8000)。 b)在Node.js上的自身http服务器上(localhost:3000)。
Ans: 您不需要将nodejs作为self hosted.instead运行nodejs通过Apache服务器并使用fusion passenger也是如此。 fusion passenger将永远负责在后台运行您的节点应用程序。我个人更喜欢Nginx + fusion用于我的nodejs应用程序。
哪种架构最适合生产使用 - 客户端和服务器端的两个独立服务器或仅一个?
Ans: 我不明白你的意思是两个服务器一个用于客户端,一个用于服务器端。将您的客户端和服务器代码保存在单个服务器上。
在服务器端使用跨源资源共享(CORS)是不错的做法(如果我应该有两个独立的服务器)?
答案 如果您的服务器和您的客户在同一个域下,那么您不必担心CORS,但如果您将来想要将API公开给任何客户端应用程序,然后您将需要进行CORS配置。
我应该怎样做才能将http://localhost:3000/api/brands硬地址代码服务器端(最佳做法)?
Ans: 我使用常量来声明我的基本路径,然后在我的服务和工厂中进行进行API调用的DI。
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
}
});
}]);