2013-02-24 101 views
6

我將盡可能詳細地解釋問題。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是:

<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中的控制檯日誌!
這是我面臨的問題。任何線索我做錯了什麼?

+0

在瀏覽器控制檯中拋出什麼錯誤? – charlietfl 2013-02-24 18:36:14

+0

@charlietfl可能沒有。大多數情況下,當頁面似乎凍結時,這是因爲響應沒有結束。 – Pickels 2013-02-24 18:39:41

+0

'可能沒什麼'?錯誤被拋出或者不是 – charlietfl 2013-02-24 20:01:07

回答

8

終於搞清楚了 - 經過很多激烈的拉發時刻!
爲什麼頁面死機的原因是(說明一步一步)

  1. 用戶推出本地主機:3000
  2. 這就要求明示服務器「/」
  3. 快速渲染的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);
    });

裏面的ROOT目錄的app.js。一旦我添加了這段代碼,頁面就會按預期呈現。

+0

另一個(更好的)解決方案是將你的partials放到你的'public'文件夾中,這樣它們將被靜態中間件服務,而不需要爲它們創建特定的路由,也不需要通過路由器/應用棧。請注意,由於用戶需要從express下載索引頁,加載DOM和Angular,進行Http請求調用來獲取部分內容,執行Javascript來呈現頁面,因此用戶加載頁面的速度會很慢。相當複雜和慢IMO。 – jtblin 2013-09-21 08:23:45

+0

@jtblin我認爲你的解決方案適用於你的模板是公開的......在我的情況下,它們是受限制的,只有通過適當的授權才能訪問...... – callmekatootie 2013-09-21 19:15:24

0

請嘗試遵循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(){ 

}); 
+0

我想保留'app.config()'內的app.js和'app.controller()'在controllers.js文件中。但是,在controllers.js中,如果我使用局部變量,它不起作用。不知道爲什麼 – callmekatootie 2013-02-25 10:26:44