簡體   English   中英

"如何使用 express.js 配置動態路由"

[英]How to configure dynamic routes with express.js

我有一個看起來像這樣的 route.js:

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

};

我會為/modules/:name做同樣的事情

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

從休息的角度來看,這將更有意義。

如果您因任何特定原因無法執行此操作,則可能需要執行以下操作:

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

這是你的意思嗎?

終於搞定了。。

在我得到文章1,文章2等的情況下:

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

有很多方法可以實現動態快速路由。 這很大程度上取決於你在項目中實現的結構,這里我舉一個動態路由的例子,希望對你有用。

路由器服務.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;
})();

這是我在控制哪些 API 允許訪問哪些方法時創建動態 API 所做的。 要從現在開始維護 API,您只需編輯 API 數組即可。

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

以下是其他幾個解決方案:

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

或使用app.all作為第一個解決方案或使用通用中間件:

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

我創建了一個名為: jadewalker<\/a>的新模塊。 它將自動創建路由器代碼。

我們可以簡單地在您的jade<\/code> Or pug<\/code>文件中添加一個jadewalker<\/code>注釋。

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

這是我的項目的工作

routesPath = path.join(__dirname, 'routes');

fs.readdirSync(routesPath).forEach(function(file) {
  require(routesPath + '/' + file)(app);
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM