2016-08-07 2 views
0

Ich habe die folgenden Express-Server eingerichtet (Server ist nur Express() aus einer anderen Datei). Ich bin mir sicher, dass es eine Möglichkeit gibt, dies auf nur einen Server zu vereinfachen.get(), aber ich konnte nicht herausfinden, wie. Jede Hilfe oder Punkte in die richtige Richtung würden geschätzt.Ich möchte dem DRY-Prinzip folgen und das Routing auf diesem Express-Server vereinfachen?

module.exports.api = function (server, fs) { 

    server.get('/api/getData/:uuid', function (req, res) { 
     fs.readFile(__dirname + '/data.json', function (err, data) { 
      if (err) throw err; 
      data = JSON.parse(data); 
      data.forEach(function (match) { 
       match['uuid'] = match['x'] + '-' + match['y']; 
      }); 
      var match = data.filter(function (e) { 
       return e.uuid == req.params.uuid 
      })[0]; 
      res.send(200, match); 
     }); 
    }); 

    server.get('/api/getData', function (req, res) { 
     fs.readFile(__dirname + '/data.json', function (err, data) { 
      if (err) throw err; 
      data = JSON.parse(data); 
      data.forEach(function (match) { 
       match['uuid'] = match['x'] + '-' + match['y']; 
      }); 
      res.send(200, data); 
     }); 
    }); 
}; 
+0

Für den Anfang können Sie alle gemeinsamen Code nehmen und es in einer gemeinsamen Funktion, die jede Route verwendet. Der kopierte Code ist viel mehr ein Problem als zwei Routendefinitionen. – jfriend00

Antwort

1

Hier ist eine Lösung, die den gemeinsamen Code in eine gemeinsame Funktion nur bewegt, aber immer noch verwendet die beiden Routen für Routing-Klarheit:

function getData(res, uuid) { 
    fs.readFile(path.join(__dirname, 'data.json'), function (err, fileData) { 
     if (err) { 
      return res.send(500); 
     } 
     let data = JSON.parse(fileData); 
     data.forEach(function(match) { 
      match['uuid'] = match['x'] + '-' + match['y']; 
     }); 
     if (uuid) { 
      var match = data.filter(function (e) { 
       return e.uuid == uuid; 
      })[0]; 
     } 
     res.send(200, match); 
    }); 
} 


module.exports.api = function (server, fs) { 
    server.get('/api/getData/:uuid', function (req, res) { 
     getData(res, req.params.uuid); 
    }); 

    server.get('/api/getData', function (req, res) { 
     getData(res); 
    }); 
}; 

Dies ändert die folgenden Dinge:

  1. Fügt gemeinsamen Code in die Funktion getData() ein, die von beiden Routen aufgerufen wird.
  2. Sendet eine Fehlermeldung, wenn fs.readFile() einen Fehler
  3. Erzeugt neue lokale Variable hat, damit es nicht zu einem Funktionsargument nicht zuordnen zurück, das jetzt eine weniger wünschenswerte Praxis, weil es einige Optimierungen Interpreter verhindert.
  4. Verwendet path.join(), um Teile eines Pfads auf eine plattformübergreifende Weise zu verbinden.

FYI, es sei denn, die Daten in data.json tatsächlich von Zeit zu Zeit ändert, können Sie diese Daten in eine Variable gelesen nur einmal und es dann eher cachen, als es dieser Anforderungen auf jedem rereading.


Hinweis: Sie können Routing-Platzhalter verwenden, und Ihr Code auf einem einzigen Weg zu verringern, aber dies ist vor allem ein Anti-Muster betrachtet, weil Wildcards oft viel mehr entsprechen, als Sie wollen, Situationen schaffen, in dem Sie manuell 404 auslösen haben Fehler für Dinge, die Sie nicht abgleichen wollten, die mit Ihrem Routing-Platzhalter übereinstimmten. Daher wird es als eine gute Sache angesehen, die Routen, die Sie beabsichtigen, explizit zu deklarieren und nur den entsprechenden Implementierungscode zu teilen, anstatt zu versuchen, die Komponenten auf eine einzige Route zusammenzufassen, die mehr als einer Form von URL entspricht.

Es gibt natürlich immer Ausnahmen von erinnern, dass das Ziel ist klar, korrekt, wartbar, zuverlässiger Code, nicht unbedingt die geringste Anzahl von Routen.


Wenn Sie nur die data.json Daten auf Server-Startzeit cachen möchten, können Sie require() verwenden, um es so für Sie zu laden und zu analysieren und dann gibt es wirklich keinen Grund für die Sharef fucntion:

const cacheData = require('./data.json'); 
cacheData.forEach(function(match) { 
    match['uuid'] = match['x'] + '-' + match['y']; 
}); 

module.exports.api = function (server, fs) { 
    server.get('/api/getData/:uuid', function (req, res) { 
     let match = cacheData.filter(function (e) { 
      return e.uuid == req.params.uid; 
     })[0]; 
     res.send(match); 
    }); 

    server.get('/api/getData', function (req, res) { 
     res.send(cacheData); 
    }); 
}; 
+0

Toll Ich werde das versuchen und zu dir zurückkommen. Die Daten ändern sich nicht, deshalb wollte ich wirklich wissen, wie man sie in einer Variablen speichert, anstatt dieselben Daten erneut anzufordern. –

+0

@OliPlunkett - Ich habe eine Version hinzugefügt, die die Daten beim Serverstart einmal zwischenspeichert. Beachten Sie, dass Sie 'require()' verwenden können, um eine '.json'-Datei zu laden und zu analysieren. – jfriend00

Verwandte Themen