【问题标题】:Express and AngularJS - web page freezes when attempting to open home pageExpress 和 AngularJS - 尝试打开主页时网页冻结
【发布时间】:2013-02-09 21:20:42
【问题描述】:

我会尽可能详细地解释这个问题。

我正在尝试将 AngularJS 与 Express 一起使用,但遇到了麻烦。我希望显示 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 中查看控制台日志!
这是我面临的问题。关于我做错了什么的任何线索?

【问题讨论】:

  • 浏览器控制台抛出什么错误?
  • @charlietfl 可能什么都没有。大多数情况下,当页面似乎冻结时,是因为响应没有结束。
  • probably nothing??要么抛出错误,要么不抛出
  • @charlietfl 无。页面只是冻结。一段时间后,Chrome 会告诉我该页面响应时间过长,并询问我是否要终止该页面。
  • @charlietfl 终于想通了。在下面检查我的答案。

标签: node.js express angularjs


【解决方案1】:

尝试遵循this working fiddle 中的设计模式。代码如下所示。您可以用 templateUrl 替换模板选项,它应该仍然可以正常工作。

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(){

});

【讨论】:

  • 我想将 app.config() 保留在 app.js 中,将 app.controller() 保留在 controllers.js 文件中。但是,在 controllers.js 中,如果我使用局部变量,它就不起作用。不知道为什么
【解决方案2】:

终于弄明白了——经过多次激烈的拉头发!!
页面冻结的原因是因为(一步一步解释):

  1. 用户启动 localhost:3000
  2. 这会向快速服务器请求“/”
  3. Express 呈现 index.html
  4. AngularJS 将呈现模板“partials/test.html”。
  5. 在这里,我大胆猜测 - AngularJS 已对页面“partials/test.html”发出 HTTP 请求。
  6. 但是,您可以看到 express 或者 app.js 没有此 GET 请求的处理程序。也就是缺少以下代码:

    app.get('partials/:name', function(request, response) {
    var name = request.params.name;
    response.render('partials/' + name);
    });

在根目录的app.js 内。添加此代码后,页面将按预期呈现。

【讨论】:

  • 另一个(更好的)解决方案是将您的部分放在您的 public 文件夹中,这样它们将由静态中间件提供服务,而无需为它们创建特定的路由,也无需经过路由器/应用程序堆栈。请注意,您的系统对于用户加载页面来说会非常慢,因为他们需要从 express 下载索引页面,加载 DOM 和 Angular,进行 Http 请求调用以获取部分,执行 Javascript 来呈现页面。 IMO 相当复杂和缓慢。
  • @jtblin 我认为您的解决方案适用于您的模板是公开的...在我的情况下,它们受到限制,只能通过适当的授权访问...
猜你喜欢
  • 2017-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多