Express和AngularJS – 尝试打开主页时,网页会冻结
我会尽可能详细地解释这个问题。
我试图用Express来使用AngularJS,并且遇到了麻烦。 我希望显示HTML文件(不使用模板引擎)。 这些HTML文件将有AngularJS指令。
但是,我无法显示一个简单的HTML文件本身!
目录结构如下:
Root ---->public -------->js ------------>app.js ------------>controllers.js ---->views -------->index.html -------->partials ------------>test.html ---->app.js
public/js/app.js
的内容是:
angular.module('myApp', []). config(['$routeProvider', function($routeProvider) { $routeProvider.when('/', {templateUrl: 'partials/test.html', controller: IndexCtrl}); $routeProvider.otherwise({redirectTo: '/'}); }]);
public/js/controllers/js
是:
function IndexCtrl() { }
views/index.html
body标签的内容是:
<div ng-view></div>
而已。 期望的是,AngularJS将用test.html – views/partials/test.html
代替上面的视图,其内容是:
This is the test page!
封闭在段落标记内。 而已!
最后, ROOT/app.js
文件的内容是:
var express = require('express'); var app = module.exports = express(); // Configuration app.configure(function(){ app.set('views', __dirname + '/views'); app.engine('html', require('ejs').renderFile); app.use(express.bodyParser()); app.use(express.methodOverride()); app.use(express.static(__dirname + '/public')); app.use(app.router); }); app.configure('development', function(){ app.use(express.errorHandler({ dumpExceptions: true, showStack: true })); }); app.configure('production', function(){ app.use(express.errorHandler()); }); // routes app.get('/', function(request, response) { response.render('index.html'); }); // Start server app.listen(3000, function(){ console.log("Express server listening on port %d in %s mode", this.address().port, app.settings.env); });
现在,当我在根文件夹中执行$node app.js
时,服务器启动时没有任何错误。 但是,如果我在浏览器中访问localhost:3000
,则URL将变为localhost:3000/#/
,页面将卡住/冻结。 我甚至无法检查Chrome中的控制台日志!
这是我面临的问题。 任何线索我做错了什么?
最后算出来 – 经过很多激烈的拉发时刻!
页面冻结的原因是因为(一步一步解释):
- 用户启动localhost:3000
- 这要求快递服务器的'/'
- 快递呈现index.html
- AngularJS将呈现模板“partials / test.html”。
- 在这里,我正在猜测 – AngularJS已经为页面“partials / test.html”做了一个HTTP请求。
-
不过,你可以看到express或者说app.js没有这个GET请求的处理器。 也就是说,下面的代码丢失了:
app.get('partials /:name',function(request,response){
var name = request.params.name;
response.render('partials /'+ name);
});
在ROOT目录的app.js
里面。 一旦我添加了这个代码,页面按预期呈现。
尝试遵循这个工作小提琴的devise模式。 代码如下所示。 你可以用templateUrlreplace模板选项,它应该仍然工作正常。
var app = angular.module('app', []); app.config(['$routeProvider', function($routeProvider){ $routeProvider.when('/', {template: '<p>Index page</p>', controller: 'IndexCtrl'}); $routeProvider.otherwise({redirect:'/'}); }]); app.controller('IndexCtrl', function(){ });