2016-04-25 5 views
3

Wie kann ich festlegen, ob das Routing für express.static Groß-und Kleinschreibung ist? z.B. ob Express eine Anforderung für image.jpeg verarbeiten soll, indem eine lokale Datei namens Image.jpeg bereitgestellt wird.Berücksichtigung der Groß- und Kleinschreibung von Node.js Express statische Assets

Es gibt eine Option, wenn casesensitive express.Router([options]) Aufruf (wie bei http://expressjs.com/en/4x/api.html definiert), aber dies ist keine Option, wenn express.static(root, [options]) (Dokumentation auf dem gleichen Link) aufrufen.

Standardmäßig bekomme ich ein anderes Verhalten bei der Zustellung statischer Dateien von Groß-/Kleinschreibung (/ Mac OS X) auf Groß- und Kleinschreibung (/ Linux). Dies führt zu inkonsistenten Fehlern in unserer Anwendung - wo etwas mit einem Fall nicht übereinstimmen funktioniert lokal unter Mac OS X, aber fehlschlägt bei der Bereitstellung auf dem Linux-Server.

+0

Ich würde lieber versuchen, Dateipfadkonsistenz dort zu garantieren. Wenn die angeforderte Datei 'image.jpeg' ist, benennen Sie sie nicht 'Image.jpeg'. Gibt es etwas, das dich davon abhält? –

+3

Die Absicht ist sicherlich, dass der Fall übereinstimmen würde, aber diese Inkonsistenz im Verhalten bedeutet, dass unsere Infrastruktur anfällig für Tippfehler/Entwicklerfehler ist und dass Probleme erst nach Bereitstellung des Codes erkannt werden. Ich möchte entweder lokal und auf dem Server den Code auf Fehler setzen, oder lokal und auf dem Server erfolgreich sein. –

+0

'serve-static' hat keine Option, um die Groß-/Kleinschreibung anzugeben (was auf manchen Plattformen, wie Sie bereits erwähnt haben, schwierig zu erreichen ist). Am besten würden Sie Integrationstests durchführen, die den Serverprozess für die Bereitstellung statischer Dateien abdecken. –

Antwort

1

wurde ich:

eine Richtlinie festlegen, die alle Ihre statischen Dateien und Pfade in Klein sein sollten.

Erzwingen Sie die Richtlinie für die Dateien, indem Sie einen Buildschritt hinzufügen, der sie überprüft.

Erzwingen Sie die Richtlinie für Anforderungen, indem Sie eine Middleware hinzufügen, die Anforderungen an den statischen Ordner zurückweist, wenn Großbuchstaben im Pfad gefunden werden.

1

Ich wollte das auch, also klopfte ich einen schnellen Weg zu 404 Anfragen mit nicht übereinstimmendem Fall.

Es ist nicht besonders effizient, so dass ich es nur in der Entwicklung ausführen. Es überprüft nur den Dateinamen. Es prüft nicht den Fall der Ordner über der Datei.

Wie man es verwendet:

var express = require('express'); 

var app = express(); 
// You can do this before or after the express() call 
// But it must come before express.static() is called 
var inDevelopment = (process.NODE_ENV || 'local') === 'local'; 
if (inDevelopment) { 
    require('./modules/makeExpressStaticCaseSensitive')(express); 
} 

app.use(express.static(path.join(__dirname, 'public_html'))); 

Das Skript module/makeExpressStaticCaseSensitive.js

module.exports = function (express) { 
    var fs = require('fs') 
    var pathlib = require('path'); 
    var parseUrl = require('express/node_modules/parseurl') 

    var oldStatic = express.static; 
    var newStatic = function (root, options) { 
     var opts = Object.create(options || null); 

     var originalHandler = oldStatic(root, options); 

     var wrappedHandler = function (req, res, next) { 
      var filepath = pathlib.join(root, parseUrl(req).pathname); 
      var dirpath = pathlib.dirname(filepath); 
      var filename = pathlib.basename(filepath); 

      // @todo Reading the entire directory listing and then searching it is quite inefficient for large folders 
      //  We should find a more efficient way to do this for one file at a time 
      fs.readdir(dirpath, function (err, files) { 
       if (err) return next(err); 

       var fileIsThere = files.indexOf(filename) >= 0; 
       if (fileIsThere) { 
        originalHandler(req, res, next); 
       } else { 
        res.status(404).end(); 
       } 
      }); 
     }; 

     return wrappedHandler; 
    }; 
    express.static = newStatic; 
}; 

ich eine effizientere Version geschrieben haben, die die Ausgabe von readdir() für einige Sekunden-Caches und den gesamten Pfad überprüfen, aber es ist etwas länger. auch einige Ratschläge für eine einfache alternative Lösung gegeben

Verwandte Themen