2016-08-18 2 views
0

Ich möchte "Basis" REST-Aufrufe mit Express erweitern, aber ich denke, dass ich in eine Beschränkung (oder mein Unverständnis) läuft. Ich möchte, dass alle REST-Endpunkte dieselben grundlegenden REST-Routen verwenden. Ich möchte nicht, diese für jeden Endpunkt-Dienst schreiben (dh Planeten, Sterne, etc ...)Express Variable Base Routes (REST) ​​

app.get('/api/planet/type',function(req,res) { 
    ... 
}); 

app.get('/api/planet/type/:_id',function(req,res) { 
    ... 
}); 

app.post('/api/planet/type',function(req,res) { 
    ... 
}); 

app.patch('/api/planet/type/:_id',function(req,res){ 
    ... 
}); 

app.delete('/api/planet/type/:_id',function(req,res) { 
    ...  
}); 

Was ich würde es vorziehen, ist eine Variable in meiner Implementierung Modul zu tun, verwendet

require('base-rest')('/api/planet/type',planet-model); 
require('base-rest')('/api/star/type',star-model); 

Verwenden Sie dann eine Variable für den Basisendpunkt, aber es scheint, dass express dynamische Routen zur Laufzeit verarbeiten kann.

app.get(baseURL,function(req,res) { 
    ... 
}); 

app.get(baseURL+'/:_id',function(req,res) { 
    ... 
}); 

Ist das möglich? Wenn ja, wie kann ich dies erreichen?

Bitte beachten Sie, ich bin mit Express v4

+0

Also ich denke, das ist nicht möglich? Jemand? – gpeters

Antwort

0

Dies kann tatsächlich getan werden (mit Vorbehalten). Dies ist etwas von Hages Beitrag skizziert.

//base.js 

var express = require('express'); 
var router = express.Router(); 
.... 
router.get('/:id', function(req, res) { 
    .... 
}); 
//Additional routes here 

module.exports = router 

Die Implementierungsdatei

//planets.js 
var base = require('./base'); 
app.use('/api/planets',base); 

Ausführliche Informationen finden Sie hier: aber https://expressjs.com/en/guide/routing.html

Es gibt eine Einschränkung dabei ist. Ich kann base.js nicht für mehrere Implementierungen verwenden, da node.js standardmäßig Singletons für require('./base') verwendet. Das bedeutet, dass Sie die gleiche Instanz erhalten, wenn ich wirklich eine neue Instanz möchte. Warum? Weil ich mein Modell für jede Basisroute injizieren möchte.

Beispiel:

var model = null; 
module.exports.map = function(entity) { 
    model = entity; 
} 

router.get('/:id', function(req, res) { 
    model.findOne(...) //using mongoose here 
}); 

Das gleiche Modell wird seit der require('./base') für alle Routen über mehrere Module verwendet werden, ist ein Singleton Import.

Wenn jemand eine Lösung dieses zusätzlichen Problems kennt, lassen Sie es mich wissen !!!

+1

Ein Link zu einer möglichen Lösung ist immer willkommen, aber bitte [fügen Sie Kontext um den Link hinzu] (http://meta.stackoverflow.com/a/8259/169503), damit Ihre Mitbenutzer eine Idee haben, was es ist und warum es ist da. Zitiere immer den relevantesten Teil eines wichtigen Links, falls die Zielseite nicht erreichbar ist oder dauerhaft offline geschaltet wird. Berücksichtigen Sie, dass es wesentlich mehr als nur eine Verbindung zu einer externen Site ist, warum [Warum und wie werden einige Antworten gelöscht?] (Http://stackoverflow.com/help/deleted-answers). –

0

Wahrscheinlich wollen Sie so etwas wie dies zu tun:

var planet = express.Router() 
planet.get('/type', function (req, res) { ... }) 
planet.get('/type/:id', function (req, res) { ... }) 
planet.post('/type', function (req, res) { ... }) 
planet.post('/type/:id', function (req, res) { ... }) 
planet.delete('/type/:id', function (req, res) { ... }) 

app.use('/api/planet', planet) 

Export des Router als lokalen Knotenmodul.