Vraag Hoe dynamische routes met express.js te configureren


Ik heb een route.js die er zo uitziet:

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);
  });

};

Gezien het feit dat ik meer dan 200 verschillende routes heb om te creëren, zou ik eindigen met dingen als 'article1', 'article2' enz

en mijn app.js is als:

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);

Is er een dynamische manier om dit te maken?


26
2017-09-02 12:06


oorsprong


antwoorden:


Ik zou hetzelfde doen als waar je voor deed /modules/:name

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

Het zou zinvoller zijn vanuit een rustpunt.

Als u het om een ​​bepaalde reden niet kunt doen, wilt u misschien iets doen zoals:

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

Is dit wat je bedoelde?


30
2017-09-02 12:13



Eindelijk kreeg het werken ..

In gevallen waar ik kreeg, article1, article2 etc:

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

In gevallen waar ik URL met meerdere niveaus kreeg, maakte ik een aangepaste functie:

function geturl(url) {

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

};

9
2017-09-02 13:41



Hier zijn een paar andere oplossingen:

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();
});

of gebruik app.all voor de eerste oplossing of gebruik een generieke 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(); 
});

2
2017-09-02 12:24



Er zijn veel manieren om dynamische snelwegen te implementeren. Het hangt voor een groot deel af van de structuur die je in je project hebt geïmplementeerd, hier laat ik een voorbeeld achter van dynamische routes en ik hoop dat het nuttig zal zijn.

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')());

2
2018-03-28 16:04



Ik maak een nieuwe module genaamd: jadewalker. Het zal routercode automatisch creëren.

We kunnen gewoon een toevoegen jadewalker reageer op jouw jade Of pug het dossier.

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

En voeg deze module toe aan onze app. Dat is alles.

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

We kunnen ons jade-bestand bezoeken via de URL http://localhost:3000/b/abc. (^ ∀ ^)


0
2018-06-08 05:58