Wenn Sie eine RESTful API implementieren, sollten Sie daran denken, dass dies nur eine Art und Weise ist, wie Sie Daten zur Verfügung stellen kann, und Sie Vielleicht möchten Sie es in Zukunft ändern, da die API die meiste Zeit nur eine Übersetzungsschicht sein wird.
Normalerweise teilen Sie Ihren Code basierend auf den Ressourcen, und der Code, der die Anfrage verarbeitet, wird nicht so viel Logik haben, es wird nur die Anfrage übernehmen und an Ihre interne API übergeben. Zu diesem Zweck benötigen Sie keine zusätzliche Ebene, wenn Sie bereits oder eine ähnliche Bibliothek verwenden.
In express bietet die app.use([path,] function [, function...])
bereits die Funktionalität, die Sie benötigen, um Ihren Code zu modularisieren. Für jede Ressource erstellen Sie eine eigene express.Router
, die möglicherweise auch ein anderes Untermodul mounten könnte. Für diesen Teil brauchst du also keine Bibliothek.
Wann könnte eine Bibliothek nützlich sein:
- wenn es Fehler automatisch auf die richtige Antwortcodes
- wenn sie ein Werkzeug enthält, um automatisch eine Dokumentation zu Ihrem API erstellen
- wenn es vollständig geworfen übersetzt abstrahiert das darunterliegende Routing-System, so dass Sie in
express
, hapi
, ... einhaken können, ohne den Code ändern zu müssen.
Hier, wie ein Setup mit express.js
wie
./lib/rest/customer.js aussehen könnte
var customerSystem = require('../customer-system');
var express = require('express');
var router = new express.Router();
router.get('/:id', function(req, res, next) {
customerSystem.find({
id: req.params.id
}, function(err, customer) {
if (err) {
res.status(/*correct status code*/).send(/*depending on the api return json, xml, ....*/)
} else {
res.send(/*depending on the api return json, xml, ....*/)
}
})
});
router.delete('/:id', function(req, res, next) {
customerSystem.delete({
id: req.params.id
}, function(err) {
//...
});
});
router.post('/', function(req, res, next) {
//...
});
//save the customer id for the pass to the sub routers
router.use('/:id', function(req, res, next) {
req.customerId = req.params.id;
next();
});
router.use('/:id/addresses', require('./customer-address'))
module.exports = router;
./lib/rest/customer-address.js
var customerSystem = require('../customer-system');
var express = require('express');
var router = new express.Router();
router.get('/:id', function(req, res, next) {
customerSystem.find({
id: req.customerId
}, function(err, customer) {
// ...
})
});
/* ..... */
//save the address id for the pass to the sub routers
router.use('/:id', function(req, res, next) {
req.addressId = req.params.id;
next();
});
router.use('/:id/addresses', require('./customer-address'))
module.exports = router;
Sie haben vergessen, + '. Js' zur routeObject-Variable hinzuzufügen. Ansonsten ist dies eine funktionierende Lösung und ich werde es implementieren! – Rcls
@Rcls nodejs fügt automatisch '.js' hinzu. Ich würde das Suffix ".js" überhaupt nicht hinzufügen, weil der Vorteil der Verwendung eines Suffixes weniger "require" darin besteht, dass Sie Ihre Datei später durch ein _modul ersetzen können (z. B. wenn Sie den Code in kleinere Teile aufteilen müssen). –
Danke für die Info! Ich habe die module.exports tatsächlich in eine Funktion geändert, damit ich den Verbindungsparameter an sie übergeben kann. – Rcls