wake-up-neo.net

So konfigurieren Sie dynamische Routen mit express.js

Ich habe eine route.js, die so aussieht:

module.exports = function(app) {

  app.get('/tip', function(req, res) {
    res.render("tip");
  });

  app.get('/article', function(req, res) {
   res.render("article");
  });

  app.get('/article1', function(req, res) {
   res.render("article1");
  });

  app.get('/article2', function(req, res) {
   res.render("article2");
  });

  app.get('/article3', function(req, res) {
   res.render("article3");
  });

  app.get('/modules/:name', function(req, res) {
    var name = req.params.name;
    res.render('modules/' + name);
  });

  app.get('/modules/esaver/:name', function(req, res) {
    var name = req.params.name;
    res.render('modules/esaver/' + name);
  });

};

Wenn man bedenkt, dass ich über 200 verschiedene Routen erstellen muss, würde ich am Ende Dinge wie 'article1', 'article2' etc

und meine app.js ist wie:

var express = require('express')
  ,http = require('http')
  ,fs = require('fs')
  ,path = require('path');

var app = express();

html_templates = __dirname + '/html_templates';

app.set('views', html_templates + '/views');
app.set('view engine', 'jade');

app.use('/Core', express.static(__dirname + '/Core'));


app.listen(3000, function () {
 console.log("express has started on port 3000");
});

require('./html_templates/controller/routes.js')(app);

Gibt es einen dynamischen Weg, um dies zu schaffen?

34
wasiim_dev

Endlich hat es funktioniert ..

In den Fällen, in denen ich Artikel 1, Artikel 2 usw. bekam:

app.get('/:name(article|article2|article3)?', function(req, res) {
    var name = req.params.name;
    res.render(name);
});

In Fällen, in denen ich eine mehrstufige URL erhielt, habe ich eine benutzerdefinierte Funktion erstellt: 

function geturl(url) {

  app.get('/' + url + '/' + ':name', function(req, res){
    var name = req.params.name;
    res.render(url + '/' + name);
  });

};
13
wasiim_dev

Ich würde das Gleiche tun, was Sie für /modules/:name getan haben.

app.get('/article/:id', function(req , res){
  res.render('article' + req.params.id);
});

Es wäre aus einem Ruhepunkt sinnvoller.

Wenn Sie dies aus bestimmten Gründen nicht tun können, möchten Sie vielleicht Folgendes tun:

var articlesEndpoints = ['/article2', '/article3'];
articlesEndpoints.forEach(function(name) {
  app.get(name, function(req, res) {
    res.render(name);
  });
});

Hast du das gemeint?

42

Es gibt viele Möglichkeiten, dynamische Expressrouten zu implementieren. Das hängt in hohem Maße von der Struktur ab, die Sie in Ihrem Projekt implementiert haben. Ich gebe hier ein Beispiel für dynamische Routen, und ich hoffe, dass es nützlich ist.

RouterService.js

module.exports = (function(myCustomRoutes) {
   let express = require('express');
   let router  = express.Router();
   let methods = Object.keys(myCustomRoutes); // getting methods ('get', 'post'... etc)
   let routesMethod = null;
   let url = null;

   for(i in methods) {
      routesMethod = Object.keys(myCustomRoutes[methods[i]]);
      for(j in routesMethod) {
         url = '/' + routesMethod[j];
         url += '/:' + myCustomRoutes[methods[i]][routesMethod[j]].params.join('/:');console.log(url);
         router[methods[i]](url, myCustomRoutes[methods[i]][routesMethod[j]].controller);
      }
   }

   return router;
})();

CustomRoutes.js

module.exports = (function() {
    let routes = {get: {}, post: {}};
    let routerService = require('./RouterService');

    // GET:  /dynamic1
    routes.get.dynamic1 = {
       params: [],
       controller: function(req, res, next) {
           res.send('route 1');
       }
    };

    // GET:  /dynamic2/:param1
    routes.get.dynamic2 = {
       params: [':param1'],
       controller: function(req, res, next) {
           res.send('route 2');
       }
    };
    // POST: /dynamic3/:param1/:param1
    routes.post.dynamic3 = {
       params: ['param1', 'param2'],
       controller: function(req, res, next) {
          res.send('route 3');
       }
    };

    /*
    *  Export a router with paths
    *  GET:  /dynamic1
    *  GET:  /dynamic2/:param1
    *  POST: /dynamic3/:param1/:param1
    **/
    return routerService(routes);
})();

app.js

let express = require('express');
let app = express();


/*
 *  Option 1
 *  GET:  /dynamic1
 *  GET:  /dynamic2/:param1
 *  POST: /dynamic3/:param1/:param1
 **/
 app.use(require('CustomRoutes')());


/*
 *  Option 2
 *  GET:  /api/v1/dynamic1
 *  GET:  /api/v1/dynamic2/:param1
 *  POST: /api/v1/dynamic3/:param1/:param1
 **/
 app.use('/api/v1', require('CustomRoutes')());
5
Alan Olivares

Hier sind ein paar andere Lösungen:

app.get(^\/article(\d{1,3})?\/?$, function(req, res, next) {
  var n;
  if (req.params[0])
    n = parseInt(req.params[0], 10);

  if (!n || (n > 0 && n < 900))
    res.render('article' + (n ? n : ''));
  else
    next();
});

oder verwenden Sie app.all für die erste Lösung oder verwenden Sie eine generische Middleware:

app.use(function(req, res, next) {
  var m = ^\/article(\d{1,3})?\/?$.exec(req.url);
  if (m) {
    var n;
    if (m[0])
      n = parseInt(m[0], 10);

    if (!n || (n > 0 && n < 900))
      return res.render('article' + (n ? n : ''));
  }
  next(); 
});
3
mscdex

So habe ich dynamische APIs erstellt, während ich kontrolliere, welche API den Zugriff auf welche Methoden erlaubt. Um die APIs jetzt zu verwalten, können Sie einfach das APIs-Array bearbeiten.

const APIs = [
    {
        route: 'order',
        methods: ['get', 'post']
    },
    {
        route: 'item',
        methods: ['get']
    },
]
APIs.forEach(api => {
    api.methods.forEach(method => {
        app[method]('/' + api.route, (req, res) => require('./routes/' + api.route)[method](req, res))
    })
})
0
holydragon

Ich erstelle ein neues Modul mit dem Namen: jadewalker . Der Router-Code wird automatisch erstellt.

Wir können einfach einen jadewalker-Kommentar zu Ihrer jade- oder pug-Datei hinzufügen.

//- jadewalker=/b,/b/:id
doctype html
html
 title b.jade
body
  p b.jade
  p params: #{params.id}

Fügen Sie dieses Modul unserer app hinzu. Das ist alles.

var app = require('koa')()
var router = require('koa-router')();
router = require('jadewalker')(router, path.join(__dirname, 'views'));
app.use(router.routes());

Wir können unsere Jade-Datei über die URL http://localhost:3000/b/abc aufrufen. ^ ∀ ^) 

0
zhoukekestar