2017-04-11 1 views
-1

Ich habe drei Dateien server.js, views.js und access.jsWie die Mehrdeutigkeit von Routen in Express.js zu vermeiden

In server.js habe ich alle setzen die dependencies und einige routes wie

app.post('/services/getallversions', (req, res) => { 
... 
// code to handle the req and send response 
}) 

In views.js I-Code haben wie unten,

module.exports = function(app, db, bodyParser, rules, constants, query) { 

app.post('/services/user/:user/:type', (req, res) => { 
// user can be 'abcd' 
// type can be addview, deleteview etc. 

... 
// do processing for the req and send res 
}) 


} 

In access.js habe ich Code wie,

module.exports = function(app, db, bodyParser, rules, constants, query) { 

app.post('/services/user/:user/:type', (req, res) => { 
// user can be 'abcd' 
// type can be addaccess, removeaccess etc. 

... 
// do processing for the req and send res 
}) 


} 

In server.js Datei benötigen ich die access.js and views.js in folgenden Weise,

var access = require('./access')(app, db, bodyParser, rules, constants, query) 
var views = require('./views')(app, db, bodyParser, rules, constants, query) 

Wenn ich versuche zu POST/services/user/abcd/addaccess meinen views.js Datei Code ausgeführt wird. constants, query, rules sind andere .js Datei, die bereits in server.js mit require('./filename') verwendet wird.

Ich verstehe, dass die Mehrdeutigkeit aufgrund gleiche URL-Struktur verursacht. Ich benutze Express 4 und Node JS 6. Ich möchte den Code access.js und views.js von server.js trennen und in separate Dateien legen und sie in der oben genannten Weise erfordern. views.js und access.js werden von mir erstellt. Sie sind kein Javascript Framework oder so ähnlich.

In view.js Ich habe auch versucht, den folgenden Code

var router = require('express').Router() 

router.post('/services/user/:user/:type', (req,res)=>{}) 

Aber das gleiche Problem besteht. Gibt es eine Möglichkeit, das Ding zu erreichen?

+0

Es fällt mir schwer zu verstehen, was genau Sie hier fragen. WIE soll der Server genau wissen, ob er 'views.js' oder' access.js' Code ausführen soll? Die URLs sind * genau * gleich. Sie sind sich dieses Problems bewusst, aber es ist unmöglich zu lösen, ohne verschiedene URLs zu verwenden, schlicht und einfach. Wenn Sie 'views.js' nach der anderen Datei einfügen, überschreibt der' app.post() 'Aufruf einfach den in' access.js'. –

Antwort

0

Ich schlage vor, Sie verwenden "MiniApp" -Konzept in Express, wo jede "MiniApp" mit Name-Space unterschieden wird.

Zum Beispiel: Haupt App:

Alle Routen mit '/ Blick/...' prefix wird viewsCtrl gehen. Diese Middleware sollte vor Ihrer default/Haupt App Routen angezeigt:

var viewsCtrl = require('./views'); 
app.use('/views', viewsCtrl); 

Innen views.js:

var router = require('express').Router(); 
// complete route /views/services/user/:user/:type 
router.get('/services/user/:user/:type', function(req, res){...}); 
module.exports = router; 

Das Gleiche gilt für access.js.

+0

@ Aman Gupta: Können Sie mir bitte den viewsCtrl-Code geben? Ich möchte wissen, wie man den Code organisiert? – Anijit

+0

der zweite Teil ist viewsCtrl, ich habe es gerade umbenannt, während in mainApp erforderlich. –

+0

https://expressjs.com/en/api.html#app.use –

0

Die Routen sind identisch und express wird nie in der Lage sein zu sagen, welche man anruft. Ordnung ist hier nicht das Problem; Wie Chris G in seinem Kommentar sagte, überschreibt der zweite Aufruf von app.post(...) den ersten (denke an URLs als Schlüssel in einem Hashset).

Sie wissen bereits, dass die URL im Format von /addview oder /removaccess usw. sein, so können Sie dieses Wissen in der Routing-Middleware setzen:

// access.js 
app.post('/services/user/:user/access/:type', (req, res) => { 
    // ... type is now only add, remove, etc... 
}) 

// view.js 
app.post('/services/user/:user/view/:type', (req, res) => { 
    // ... 
}) 

oder auch (glaube ich):

// access.js 
app.post('/services/user/:user/:type((access)$)/', (req, res) => { 
    // ... will match addaccess, removeaccess and so on 
    // but I'm not entirely sure ... 
}) 

Referenz hier:

https://expressjs.com/en/guide/routing.html

Verwandte Themen