2016-04-03 7 views
2

Ich bin nicht wirklich sicher, was zu diesem Titel, aber ich bin neu in Node.js. Ich habe gerade ein nettes REST-API-Projekt auf GitHub zum Implementieren gefunden, aber ich bin mir nicht sicher, wie ich alle GET und POST usw. in separate Dateien aufteilen kann.Node.js API-Design und Route Handhabung

Ich habe eine singuläre api.js Datei, wo ich

function API_ROUTER(router, connection, md5) { 
    var self = this; 
    self.handleRoutes(router, connection, md5); 
} 

API_ROUTER.prototype.handleRoutes = function(router, connection, md5) { 
    router.get("/", function(req, res) { 
     res.json({"Message" : "Hello World !"}); 
    }); 
}; 

module.exports = API_ROUTER; 

Jetzt haben wie kann ich ein Geschwister other.js und Nutzung zu erstellen:

var api = require('./api.js'); 

// Create router.get, router.post etc. here? 

Antwort

1

aber ich bin nicht sicher, wie ich aufspalten alle GET und POST usw., um Dateien zu trennen.

Eine Möglichkeit, Ihre Routen zu organisieren wäre für jede Strecke ein eigenes Objekt zu haben, die die Handler (von HTTP-Methoden getrennt) hat und andere erforderliche Informationen, wie zB den Weg:

api/home. js

module.exports = { 
    path: '/', 
    handlers: { 
    'get': function(req, res) { 
      res.json({"Message" : "Hello World !"}); 
     }, 
     'post': { 
     // ... 
     } 
     // ... 
    } 
} 

api/other.js

module.exports = { 
    path: '/other', 
    handlers: { 
    'get': function(req, res) { 
     res.json({"Message" : "Other !"}); 
     }, 
    // ... 

Dann können Sie alle diese innerhalb derladenMethode:

API_ROUTER.prototype.handleRoutes = function(router, connection, md5) { 
    var routes = ['home', 'other']; 

    routes.forEach(function(name) { 
    // load the current route object (NOTE: you should use the path module for determining file path in a cross-platform manner) 
    var routeObject = require('./' + name + '.js'); 

    var apiPath = routeObject.path; 
    var handlers = routeObject.handlers; 
    var methods = Object.keys(handlers); 

    // assign handlers for each method 
    methods.forEach(function(method) { 
     router[method](apiPath, handlers[method]); 
    }); 

    }); 
}; 

Dies installiert alle Ihre Routen mit den entsprechenden Informationen und Handler. Jetzt können Sie diesen Code aufrufen, indem Sie Ihre API_ROUTER mit der notwendigen Daten Instanziierung:

// initialize the api (and handle the routes internally) 
var Api = new require('./api.js')(router, connection, md5); 
+1

Sie haben vergessen, + '. Js' zur routeObject-Variable hinzuzufügen. Ansonsten ist dies eine funktionierende Lösung und ich werde es implementieren! – Rcls

+1

@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). –

+0

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

1

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; 
+0

Eigentlich habe ich irgendwie herausgefunden, was du meintest. Es ist viel einfacher, es so zu machen, ja, gebe ich zu. Was ich gemacht habe, war ein 'var router = express.Router()' in server.js, den ich dann an require ('./ api/test') (Router, Verbindung) weitergebe. Jetzt kann ich einfach alle benötigten Routendateien in server.js anfordern und habe alles was ich brauche. Danke, diese Antworten helfen mir wirklich zu verstehen, wie Knoten funktioniert. – Rcls

Verwandte Themen