Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用express.js配置动态路由_Javascript_Node.js_Express - Fatal编程技术网

Javascript 如何使用express.js配置动态路由

Javascript 如何使用express.js配置动态路由,javascript,node.js,express,Javascript,Node.js,Express,我有一个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

我有一个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);
  });

};
考虑到我有200多条不同的路线要创建,我最终会得到像“article1”、“article2”之类的东西

我的app.js就像:

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

有没有什么动态的方法来创建它?

我会做与您对
/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);
  });
});

这就是你的意思吗?

以下是一些其他解决方案:

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

终于成功了

在我得到的情况下,第1条、第2条等:

app.get('/:name(article|article2|article3)?', function(req, res) {
    var name = req.params.name;
    res.render(name);
});
在获得多级url的情况下,我创建了一个自定义函数:

function geturl(url) {

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

};

有许多方法可以实现动态快速路线。这在很大程度上取决于您在项目中实现的结构,这里我留下一个动态路由的示例,希望它会有用

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

我创建了一个名为:。它将自动创建路由器代码

我们可以简单地向您的
jade
pug
文件添加
jadewalker
注释

//- jadewalker=/b,/b/:id
doctype html
html
 title b.jade
body
  p b.jade
  p params: #{params.id}
并将此模块添加到我们的
应用程序中。就这些

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

我们可以通过URL
http://localhost:3000/b/abc
。(^∀^)

以下是我在控制哪些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))
    })
})

这是我的项目

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

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

是的,我正在寻找类似的东西,但我得到了一个错误:错误:在视图目录“C:\…(我使用了foreach)中查找视图“/article”失败。你确定
name
是你所期望的吗?你可能想记录它,看看它是否是。@wasiim\u dev你需要添加
app.set('views',u dirname+'/views'));
如果您的视图位于与Express代码所在位置相关的子目录中,则位于代码顶部附近。
默认情况下,Express会查找与当前工作目录相关的路径。是的,我确认它是name-console.log-gives->/article,/article1 etc这是您发布错误的完整路径d?这可以部分解决问题。如果我用(提示、食谱等)代替文章,怎么样这里有超过100种可能性。我想要一种可以用作“/”后面*项的泛型的东西。我让它在没有“/”的情况下工作。在路线的末尾,有任何意义吗?@AdamF
使
req.params.name
:name
可选。例如,上面的路径将“/”与空的
:name
和“/a匹配rticle2'但不是
/abc
。您可能会发现此在线功能非常有用。routerservice函数中不应存在对象实例化括号(),这会导致在函数中执行object.keys时出现NRE
routesPath = path.join(__dirname, 'routes');

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