2017-10-15 13 views
2

Je me demande comment utiliser dynamiquement le chemin dans express. Par exemple, j'utilise lodash pour trouver un chemin dans un fichier différent avec la méthode regex.Chemin dynamique dans les routes express

routes.js 

const json = require('./routes.json') 
 
const _ = require('lodash') 
 
routes.use(function(req, res, next) { 
 

 
    let str = req.path 
 
    let path = str.split('/')[1] 
 

 
    // [Request] => /test/123 
 
    console.log(path) 
 
    // [Result] => test 
 

 
    let test = _.find(json.routes, function(item) { 
 
    return item.path.match(new RegExp('^/' + path + '*')) 
 
    }) 
 
    console.log(test) 
 
    //{"path" : "/test/:id", "target" : "localhost:2018", "message" : "This is Test Response" }, 
 

 
    routes.get(test.path, function(req, res) { 
 
    res.json("Done") 
 
    }) 
 
})

Le code ci-dessus, je viens emboîtées les routes. Mais il n'y a rien de réponse. Y a-t-il des moyens de le faire? Cette méthode aussi je veux utiliser avec DB si nécessaire. Merci quand même

Répondre

0

L'utilisation de middleware est impossible. Lorsqu'une requête arrive, expressjs recherche d'abord un chemin enregistré. Alors voilà, pourquoi ce code ne fonctionne pas aussi bien.

Par exemple, je suis comme une demande de l'utilisateur: localhost:2018/test/123

S'il vous plaît suite à mon commentaire en dessous

const json = require('./routes.json') 
 
const _ = require('lodash') 
 
routes.use(function(req, res, next) { 
 

 
    let str = req.path 
 
    let path = str.split('/')[1] 
 

 
    // [Request] => /test/123 
 
    console.log(path) 
 
    // [Result] => test 
 

 
    let test = _.find(json.routes, function(item) { 
 
    return item.path.match(new RegExp('^/' + path + '*')) 
 
    }) 
 
    console.log(test) 
 
    //{"path" : "/test/:id", "target" : "localhost:2018", "message" : "This is Test Response" }, 
 

 
    //And now, the routes has been registered by /test/:id. 
 
    //But, you never get response because you was hitting the first request and you need a second request for see if that works. But you can't do a second request, this method will reseting again. Correctmeifimwrong 
 

 
    routes.get(test.path, function(req, res) { 
 
    res.json("Done") 
 
    }) 
 
})

Comment approcher cet objectif alors? Cependant, nous avons besoin d'un enregistrement de nos routes à l'intérieur app.use ou routes.use. Jusqu'à présent ce que j'ai obtenu, nous pouvons utiliser la boucle ici.

//Now, we registering our path into routes.use 
 
_.find(json.routes, function(item) { 
 
    routes.use(item.path, function(req, res) { 
 
    res.json("Done") 
 
    }) 
 
}) 
 

 
//The result become 
 

 
/** 
 
* routes.use('/test:id/', function(req, res, next){ 
 
    res.json("Done") 
 
}) 
 

 
routes.use('/hi/', function(req, res, next){ 
 
    res.json("Done") 
 
}) 
 

 
*/

Référence: Building a service API Part 4

Merci quand même, laissez-moi un commentaire s'il y a quelque chose de mal avec cette méthode: D