16

我使用 Node.js 和 ExpressJS 创建了一个 RESTful 服务。现在我想实现 View 部分。为此,我选择了 AngularJS。

这里的问题是,我不确定如何组织文件夹结构以及如何将 AngularJS 与 Node.js 和 ExpressJS 集成。

我观看了此视频,但没有可用的示例源代码。

让我们获得 CRUDdy:AngularJS 和 Node.js 法拉利示例

项目文件夹结构

在此处输入图像描述

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 代码。

如果您需要更多信息,请告诉我。

4

2 回答 2

34

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

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

选项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/指向 public/

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

设置http://api.domain.dev/指向正在运行的节点 web-server

<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.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'});
 }]);

索引.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);

其他资源:

于 2013-07-03T18:24:38.087 回答
4

我有一个现有的角度项目,其文件结构如下(大致):

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

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

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

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'));
});

然后显然在express中编写了我的路由文件并更改了角度服务中的URL以使用新的api。

还有更多的工作涉及决定将规范放在哪里以及合并凉亭和节点依赖项等,但这可能对我的情况太具体,无法包含在这个答案中,但如果有人觉得它有用,很乐意分享。

于 2013-12-06T12:47:54.303 回答