2016-06-14 7 views
0

In meiner Express-App erstelle ich Snapshots, deren Details ich in MongoDB speichern. Die tatsächlichen Snapshot-Dateien werden im Snapshot-Ordner unter ihrer _id gespeichert, z. B. /snapshots/575fe038a84ca8e42f2372da.png.Verkettete Expressroute Parameter und Dateierweiterung

Diese Momentaufnahmen können derzeit von einem Benutzer geladen werden, indem sie in ihrem Browser zu dem Ordner und der ID navigieren, d. H. /snapshots/575fe038a84ca8e42f2372da, die die Bilddatei zurückgibt. Ich denke, um intuitiver zu sein, sollte der URL-Pfad die Dateierweiterung enthalten; d.h. der Benutzer sollte /snapshots/575fe038a84ca8e42f2372da.PNG eingeben müssen, um die Datei zu erhalten.

Das ist, was ich habe zur Zeit:

router.get('/:shotID', function(req, res, next) { 

    // Checks if shot exists in DB 
    Shots.findOne({ 
     _id: req.params.shotID // More conditions might get put here, e.g. user restrictions 
    }, (err, result) => { 
     if (err) { 
      res.status(404).res.end(); 
      return; 
     } 
     var file = fs.createReadStream(`./snapshots/${req.params.shotID}.png`); 

     file.pipe(res); 
    }); 
}); 

Wie kann ich den Benutzer übernehmen in diesem Pfad in der Dateierweiterung setzen?

Antwort

0

können Sie ein custom regular expression bieten einen benannten Parameter anzupassen, die auch eine Dateierweiterung enthalten:

router.get('/:shotID(?:([a-fA-F0-9]{24})\.png$)', ...); 

Für den URL-Pfad /snapshots/575fe038a84ca8e42f2372da.png wird req.params.shotID575fe038a84ca8e42f2372da sein.

Wenn Sie sowohl mit als auch ohne .png passen möchten, können Sie diese verwenden:

router.get('/:shotID(?:([a-f0-9]{24})(?:\.png)?$)', ...);