AngularJS,Node.js,ExpressJS应用程序集成问题

我已经使用Node.js和ExpressJS创build了一个RESTful服务。 现在我想实现View部分。 为此,我select了AngularJS。

这里的问题是,我不知道如何组织文件夹结构,以及如何整合AngularJS与Node.js和ExpressJS。

我观看了这个video,但是没有示例源代码可用。

让我们来获取CRUDdy:AngularJS和Node.js Ferrari示例

项目文件夹结构

在这里输入图像描述

ExpressJS文件

var express = require('express'), http = require('http'), path = require('path'), photos = require('./routes/photos'); var app = express(); app.configure(function () { app.use(express.logger('dev')); /* 'default', 'short', 'tiny', 'dev' */ app.use(express.bodyParser()); app.use(app.router); }); app.get('/photos', photos.findAll); app.get('/view1', photos.index); 

AngularJS:

  // Declare app level module which depends on filters, and services angular.module('myApp', ['myApp.filters', 'myApp.services', 'myApp.directives', 'myApp.controllers']). config(['$routeProvider', function($routeProvider) { $routeProvider.when('/view1', {templateUrl: 'partials/partial1.html', controller: 'MyCtrl1'}); $routeProvider.when('/view2', {templateUrl: 'partials/partial2.html', controller: 'MyCtrl2'}); $routeProvider.otherwise({redirectTo: '/view1'}); }]); 

当我点击url http://www.domain/view1时 ,它应该显示index.html 。 但是我得到404代码。

请让我知道,如果你需要更多的信息。

如果您使用AngularJS来实现单页面体验,那么您应该每次都使用相同的前端代码,然后让AngularJS接pipe处理URL并显示内容。

请记住,您正在pipe理两个路由系统。 一个用于前端,一个用于后端。 Express路线映射到您的数据,通常以JSON格式返回。 (您也可以直接渲染HTML,请参阅选项#1。)angular路由映射到您的模板和控制器。

选项1:

设置静态文件夹来提供前端代码(HTML / CSS / JS / AngularJS)。

 app.use(express.static(__dirname + '/public')); 

看看这些示例代码:

目录结构:

 public/ index.html js/ angular.js css/ partials/ partial1.html partial2.html app/ node_modules/ routes/ web-server.js 

选项#2:

在不同的服务器上提供前端代码和后端代码。

这并不意味着你必须有两台机器。

这是一个在Apache 本地机器上设置的可行方法:

目录结构:

 public/ index.html js/ angular.js css/ partials/ partial1.html partial2.html node/ app/ node_modules/ routes/ web-server.js 

设置主机文件

  127.0.0.1 domain.dev 

设置http://domain.dev/指向公共/

 <VirtualHost *:80> DocumentRoot "/path/to/public" ServerName domain.dev ServerAlias www.domain.dev </VirtualHost> 

设置http://api.domain.dev/指向正在运行的节点Web服务&#x5668;

 <VirtualHost *:80> ServerName api.domain.dev ProxyPreserveHost on ProxyPass / http://localhost:3000/ </VirtualHost> 

(改编自http://www.chrisshiplet.com/2013/how-to-use-node-js-with-apache-on-port-80/

启动(或重新启动)Apache并运行您的节点服务器:

 node web-server.js 

angular度路线:

  angular.module('myApp', ['myApp.filters', 'myApp.services', 'myApp.directives', 'myApp.controllers']) .config(['$routeProvider', function($routeProvider) { $routeProvider.when('/view1', {templateUrl: 'partials/partial1.html', controller: 'MyCtrl1'}); $routeProvider.when('/view2', {templateUrl: 'partials/partial2.html', controller: 'MyCtrl2'}); $routeProvider.otherwise({redirectTo: '/view1'}); }]); 

index.html的:

  <!DOCTYPE html> <html> <head><title>Angular/Node exmaple</title></head> <body> <div id="main" ng-view></div> </body> </html> 

快速路线:

 app.get('/', photos.index); app.get('/photos', photos.findAll); 

通过$ http或$ resource服务在Angular控制器中访问这些路由:

 $http.get('http://api.domain.dev/photos').success(successCallback); 

其他资源:

我有一个文件结构像这样(大致)现有的angular项目:

 / app/ img/ scripts/ styles/ templates/ index.html test/ 

我刚刚创build了一个新的快速应用程序,并从/ public中删除所有现有的内容后,将我的应用程序目录的内容复制到/ express目录中

然后在app.js文件中,我对默​​认configuration进行了以下更改:

 var express = require('express'); var routes = require('./routes'); // ** required my route module var menu = require('./routes/menu'); var http = require('http'); var path = require('path'); var app = express(); // all environments app.set('port', process.env.PORT || 3000); app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'jade'); app.use(express.favicon()); app.use(express.logger('dev')); app.use(express.json()); app.use(express.urlencoded()); app.use(express.methodOverride()); // ** I moved this above the app.router line below, so that static routes take precedence app.use(express.static(path.join(__dirname, 'public'))); app.use(app.router); // development only if ('development' == app.get('env')) { app.use(express.errorHandler()); } // ** removed the default index route // app.get('/', routes.index); // ** defined my route app.get('/api/menu', menu.list); http.createServer(app).listen(app.get('port'), function(){ console.log('Express server listening on port ' + app.get('port')); }); 

然后显然写了我的路线文件中,并改变angular服务的URL使用新的API。

此外还有更多的工作涉及到决定在哪里放置规格,并且合并凉亭和节点依赖等,但这可能是太特定于我的情况包括这个答案,但高兴地分享,如果任何人可能会发现它的用处。