Angular-routing in HTML5mode mit Node.js
Ich weiß, es gibt andere Antworten auf diese, aber Sie scheinen Vorbehalte.
Diese Ursachen eine Umleitung, die tödlich sein können für mein front-end-app, die benutzt Mixpanel, und eine Doppel-Belastung von Mixpanel wird ein Maximum Call Stack Size Exceeded Fehler im browser.
Diese verwendet man sendFile
, die ich persönlich nicht bekommen, um zu arbeiten. Versuchen, zu diagnostizieren, bin ich nur empfohlen, um express.static()
.
Derzeit mein code sieht wie folgt aus:
home.js - Einige Routen, die Letzte soll die front-end Website.
var indexPath = path.resolve( __dirname, '../' + process.env.PUBLIC_FOLDER )
router.get( '/:user/:stream/:slug', function( req, res, next ) {
if ( req.headers['user-agent'].indexOf( 'facebook' ) != -1 ) {
//stuff to handle the Facebook crawler
} else return next()
})
router.get( '/*', function( req, res ) {
express.static( indexPath )
})
server.js - Konfiguration node/express
app = express();
app
.use( morgan( 'dev' ) )
.use(bodyParser.urlencoded( { limit: '50mb', extended: true } ) )
.use( bodyParser.json( { limit: '50mb' } ) )
.use( '/api', require('./routes/usersRoute.js') )
.use( '/', require( './routes/home' ) )
.on( 'error', function( error ){
console.log( "Error: " + hostNames[i] + "\n" + error.message )
console.log( error.stack )
})
http
.createServer( app ).listen( process.env.PORT )
.on( 'error', function( error ){
console.log( "Error: " + hostNames[i] + "\n" + error.message )
console.log( error.stack )
})
Paar mehr Infos
Der Grund, warum Sie sehen können, bin ich versucht zu verwenden express.static()
ist, weil wenn ich res.sendfile()
ich ein problem wie diese, wo die Konsole sagt Unexpected token '<'
. Leider ist die Antwort nicht die genaue Korrektur, und auch nicht der Fragesteller, die sagt, Sie das problem gelöst hat, aber nicht teilen eine Antwort.
In meiner trial-and-error habe ich Hinzugefügt einige mehr, um auszudrücken, wie dies
.use( '/app/app.js', express.static( indexPath + '/app/app.js' ) )
.use( '/app/views', express.static( indexPath + '/app/views' ) )
.use( '/app/controllers', express.static( indexPath + '/app/views' ) )
.use( '/app/directives', express.static( indexPath + '/app/views' ) )
.use( '/app/vendor', express.static( indexPath + '/app/vendor' ) )
.use( '/js', express.static( indexPath + '/js' ) )
.use( '/css', express.static( indexPath + '/css' ) )
.use( '/fonts', express.static( indexPath + '/fonts' ) )
.use( '/images', express.static( indexPath + '/images' ) )
.use( '/api', require('./routes/usersRoute.js') )
.all( '/*', require( './routes/home' ) )
Und in meinem home.js
Routen-Dateien Hinzugefügt, das
router.get( '/*', function ( req, res ) {
res.status( 200 ).set( { 'content-type': 'text/html; charset=utf-8' } )
.sendfile( indexPath + '/index.html' )
})
Und im browser sehe ich alle meine Dateien laden, aber mit der <
oben genannten Fehler. Ich sehe das /*/
route genannt wird, Hunderte Male, wenn ich einen refresh, so dass ich denke, dass die .use( '...', ... )
Konfigurationen werden ignoriert.
Hier ist ein weiteres Beispiel, beantragt von Jonas unten.
var indexPath = path.resolve( __dirname, process.env.PUBLIC_FOLDER )
mongoose.connect( process.env.MONGOLAB_URI )
app = express();
app
.use( morgan( 'dev' ) )
.use(bodyParser.urlencoded( { limit: '50mb', extended: true } ) )
.use( bodyParser.json( { limit: '50mb' } ) )
.use( '/api', require('./routes/usersRoute.js') )
.use( '/', require( './routes/home.js' ) )
.use( express.static( indexPath ) )
.on( 'error', function( error ){
console.log( "Error: " + hostNames[i] + "\n" + error.message )
console.log( error.stack )
})
Ich habe auch das gleiche getan, ohne die .use( '/', require( './routes/home.js' ) )
Linie, um zu versuchen, einzugrenzen, jedes problem, aber es ist das gleiche Ergebnis. Wird die Seite geladen, wenn ich die #
in der URL, aber der browser wird entfernen Sie die #
(soweit so gut). Aber wenn ich drücken Sie auf refresh, oder setzen Sie die URL manuell, sans-hashbang, es gibt einen Fehler wie Cannot GET /home/splash
, wo /home/splash
ist welchen Weg ich gehe.
- Wie füge ich ein Kopfgeld auf diese? Es ist schon seit 4 Tagen...
- Ich bin kein Experte mit express, aber ich habe noch nie jemand schief gehen, wenn Sie die folgenden Proben in der UI-Router-FAQ, die zeigt, mit
app.all
eher alsrouter.get
. - Haben Sie überprüft, die Pfade übergeben
express.static
gültig sind? Was ist der Wert vonindexPath
? - machen Sie einfach var app = express(); app.configure(function() { ... app.use(express.static(__dirname + '/public')); ... }
- Ich glaube nicht, dass app.konfigurieren ist Teil express 4.
- Lol natürlich ist es als optional, aber immer noch. expressjs.com/api.html#app.configure
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du vielleicht die express-middleware in die falsche Richtung. Blick auf die Dokumentation sagt mir zum Beispiel, dass der folgende code
Dient eine Datei unter dem Ordner
indexPath + '/images'
mit solchen URLs:Ist, dass das, was Sie erwarten würden, es zu tun?
Mein Vorschlag ist die änderung von
zu
Weil laut der Dokumentation, Sie dienen alle statischen Dateien, die unter der
indexPath
Ordner aus dem root-Pfad, aka. ohne Präfix.Ich denke, dass ist alles, was ich kann helfen, mit dem input, den Sie gab, so weit. Wenn das nicht den trick tun, können Sie vielleicht teilen Sie einige kleine code-Beispiel, das ich verwenden kann, um es zu reproduzieren, auf meinem eigenen.
UPDATE
Ok. Ich habe versucht, erstellen ein einfaches Beispiel dafür. Ich machte es Arbeit in der folgenden Weise.
Meine Verzeichnisstruktur ist wie folgt:
index.js
ist die node-server. Achten Sie auf die Reihenfolge der routing -. Ich habe auch einige/home/login
Beispiel deutlich zu machen, wie Sie zum hinzufügen anderer server Routen, die nicht durch eckige.index.html
ist ziemlich einfach.main.html
fügt nur einige Inhalte. Wichtig ist der link zu/test
test.html
ist eigentlich irrelevantmain.js
ist tun der Kern eckig html5 arbeitenexpress.static
mit HTML5-Modus in Eckigen, bekomme ich die FehlermeldungCannot GET [path to page]
nach dem aktualisieren oder die manuelle Eingabe einer URL. Wenn ich die#
zurück zu der URL, kann ich die Seite anzuzeigen und die mit der # - entfernt wurden..use(express.static( indexPath ))
HTML5 unterstützt? Weil es offenbar nicht. Es funktioniert, bis ich auf aktualisieren, dann sagt erCannot GET /home/splash
. Wenn ich die#
zurück in der URL, lädt und entfernt die#
, aber erfrischende wieder gibt die Fehlermeldung wieder..use(express.static('public'))
erste, lege ich immer letzten.statt:
tun
halten Sie es einfach am Ende der Routen-Datei.
Cannot GET /home/login
bei der Verwendung einer Pfad-undCannot GET /
bei Verwendung eines#
im Weg.Wie es scheint, gibt es möglicherweise ein problem mit der AJAX-Anfragen.
Ich in der Regel meine Routen so:
app.use(express.static(path.join(__dirname, "./public")));
app.use("/", require(path.join(__dirname, "./routes")));
machen und Anrufe auf dem front-end mit
templateUrl: "/templates/home.html"
in einer Richtlinieoder
$http.get("/images").success(...).error(...)
mit $http.In der templateUrl Fall die app, wechseln Sie in das öffentliche Verzeichnis, dann wird der Pfad-Vorlagen und dienen der html-Datei.
In der $http Fall bin ich die Angabe einer route, sodass die app prüft die öffentlichen Verzeichnis nicht zu sehen ein Bilder-Pfad und so bewegt Sie sich auf dem router. Im router habe ich eine
router.get("/images", function (req, res, next) { res.sendFile(...);
oderres.send({(data)}) })
sendet die Datei, die ich brauche, zurück zu dem vorderen Ende, wo ist es gefangen in der Erfolgs-handler.$http
auf dem front-end und erklärt dietemplateUrl
wie Sie erklären. Verwenden Siehtml5Mode
? Können Sie bestätigen, es funktioniert mit Express?path.join(__dirname, "public")
)