2013-02-24 8 views
6

Ich werde das Problem so detailliert wie möglich erklären.Express und AngularJS - Webseite friert beim Versuch, Homepage zu öffnen

Ich versuche AngularJS mit Express zu verwenden und stehe in Schwierigkeiten. Ich möchte HTML-Dateien anzeigen (ohne eine Template-Engine). Diese HTML-Dateien haben AngularJS-Anweisungen.
Ich kann jedoch keine einfache HTML-Datei selbst anzeigen!

Die Verzeichnisstruktur ist wie folgt:

Root 
---->public 
-------->js 
------------>app.js 
------------>controllers.js 
---->views 
-------->index.html 
-------->partials 
------------>test.html 
---->app.js 

Der Inhalt public/js/app.js ist:

angular.module('myApp', []). 
    config(['$routeProvider', function($routeProvider) { 
    $routeProvider.when('/', {templateUrl: 'partials/test.html', controller: IndexCtrl}); 
$routeProvider.otherwise({redirectTo: '/'}); 
}]); 

Der Inhalt public/js/controllers/js ist:

function IndexCtrl() { 
} 

Der Inhalt des Body-Tag in views/index.html ist:

<div ng-view></div> 

Das ist es. Die Erwartung ist, dass AngularJS die oben Ansicht mit test.html ersetzen - views/partials/test.html deren Inhalt:

This is the test page! 

innerhalb der Absatz-Tags eingeschlossen. Das ist es!

Schließlich wird der Inhalt der ROOT/app.js Datei ist:

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

Nun, wenn ich $node app.js im Stammordner tun, startet der Server ohne Fehler. Wenn ich jedoch im Browser auf localhost:3000 gehe, ändert sich die URL zu localhost:3000/#/ und die Seite wird blockiert/eingefroren. Ich kann nicht einmal das Konsolenprotokoll in Chrome überprüfen!
Dies ist das Problem, mit dem ich konfrontiert bin. Irgendwelche Hinweise darauf, was ich falsch mache?

+0

Welche Fehler werden in der Browserkonsole ausgegeben? – charlietfl

+0

@charlietfl wahrscheinlich nichts. Meistens, wenn die Seite zu frieren scheint, liegt es daran, dass die Antwort nicht beendet wird. – Pickels

+0

'wahrscheinlich nichts '?? entweder werden Fehler ausgelöst oder sie sind nicht – charlietfl

Antwort

8

Endlich herausgefunden - nach vielen intensiven Augenblicken des Haarziehens !!
Der Grund, warum die Seite friert, weil (Schritt für Schritt erklärt):

  1. Benutzer starten localhost: 3000
  2. Dieser ausdrücklichen Server für '/'
  3. Express rendert index.html
  4. fordert
  5. AngularJS wird die Vorlage 'partials/test.html' darstellen.
  6. Hier nehme ich eine wilde Vermutung - AngularJS hat eine HTTP-Anfrage für die Seite 'Partials/test.html' gemacht.
  7. Sie können jedoch sehen, dass Express oder eher app.js keinen Handler für diese GET-Anfrage hat. Das heißt, der folgende Code fehlt:

    App.get ('Partials /: Name', Funktion (Anfrage, Antwort)) {
    var name = request.params.name;
    response.render ('Partials /' + Name);
    });

innerhalb app.js des ROOT-Verzeichnisses. Sobald ich diesen Code hinzugefügt habe, rendert die Seite wie erwartet.

+0

Eine andere (bessere) Lösung besteht darin, Ihre Partials in Ihren 'public'-Ordner zu legen, damit sie von der statischen Middleware bedient werden, ohne dass eine bestimmte Route für sie erstellt werden muss und ohne Router/App-Stack. Beachten Sie, dass Ihr System sehr langsam sein wird, damit Benutzer die Seiten laden können, da sie die Indexseite von express herunterladen, das DOM und Angular laden, einen HTTP-Request aufrufen müssen, um das partielle zu erhalten, Javascript ausführen, um die Seite zu rendern. Ziemlich kompliziert und langsam IMO. – jtblin

+0

@jtblin Ich denke, dass Ihre Lösung anwendbar ist, wenn Ihre Vorlagen öffentlich sind ... In meinen Fällen sind sie eingeschränkt und können nur mit den entsprechenden Berechtigungen aufgerufen werden ... – callmekatootie

0

Versuchen nach dem Design-Muster in this working fiddle. Code unten gezeigt. Sie können die Template-Option durch templateUrl ersetzen und es sollte immer noch gut funktionieren.

+0

Ich möchte die 'app.config()' in app.js und die 'app.controller()' in der Datei controllers.js behalten. Innerhalb von controllers.js funktioniert es jedoch nicht, wenn ich eine lokale Variable verwende. Ich weiß nicht, warum – callmekatootie

Verwandte Themen