2016-04-04 14 views
1

Ich verwende eine Reihe von statischen Routen in Node Express und erleben ein sehr seltsames Phänomen.Statisches Routing in Knoten Express

Das Routing ist so eingerichtet, dass '/list/*' und '/setup/*' werden auf verschiedene HTML-Dateien, in denen die Verzeichnisse Art als Speicher-ID verwendet werden, zum Beispiel Informationen über die Seite zu aktualisieren url/setup/12345 würde speichern Informationen in 12345.

Um Skripte und ähnliches laden zu können, gibt es auch eine Route mit Regex, die /assets/ entspricht, damit url/setup/assets/script.js ohne Routing zu setup.html mit einer neuen Speicher-ID erreicht werden kann.

Mein Problem ist, dass dies für url/setup/assets/script.js funktioniert, aber nicht für url/list/assets/script.js, obwohl sie identische Routings haben.


Edit:

-url/list/assets/script.js Navigation führt zu list.html (unerwünschtes Verhalten)

-url/setup/assets/script.js Navigation führt zu script.js (wollte Verhalten)


Alle Ideen, warum/Liste/* '`wird nicht funktionieren?

Hier sind meine statischen Routen:

app.use(/assets/, express.static(wwwPath)); 

app.use('/list/*', function(req, res, next) { 
    res.sendFile('list.html', { root: wwwPath }); 
}); 

app.use('/setup/*', function(req, res, next) { 
    res.sendFile('setup.html', { root: wwwPath }); 
}); 
+0

Sie wäre viel besser dran, wenn Sie nicht widersprüchliche Regeln erstellen, wo mehr als eine Regel den gleichen Pfad übereinstimmt. Momentan stimmen sowohl "/ list/*" als auch "/ assets" mit der URL überein, für die es nicht funktioniert. Wahrscheinlich ist es viel besser, eine statische Regel für '/ setup/assets' und eine weitere für'/list/assets' zu erstellen. Dann wird alles schön und klar sein ohne Überschneidungen, keine Konflikte. – jfriend00

+0

Was meinst du genau mit "'/list/* 'wont work"? – Arbel

+0

@Arbel - Navigieren zu URL/list/assets/script.js führt zu list.html (unerwünschtes Verhalten) Navigieren zu URL/setup/assets/script.js führt zu script.js (gewünschtes Verhalten) – Presidenten

Antwort

0

Die Lösung individuelle Middleware zu verwenden war. Hier sind die neuen Routen:

var requestParser = function(req, res, next) { 
    if(req.originalUrl.indexOf('/assets/') >= 0) { 
     var assetPath = path.join(wwwPath, req.path.slice(req.url.indexOf('/assets/'))); 
     fs.stat(assetPath, function(error, stat){ 
      if(stat && stat.isFile()) { 
       res.sendFile(assetPath); 
      } 
      else{ 
       res.status(404).send('<h1>404</h1>'); 
      } 
     }); 
    } 
    else { 
     next(); 
    } 
}; 

app.use(requestParser); 

app.use('/list/*', function(req, res, next) { 
    res.sendFile('schema.html', { root: wwwPath }); 
}); 

app.use('/setup/*', function(req, res, next) { 
    res.sendFile('setup.html', { root: wwwPath }); 
});