2014-09-02 4 views
22

У меня есть route.js, который выглядит следующим образом:Как настроить динамические маршруты с express.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 различных маршрутов для создания, я бы в конечном итоге с вещами, как «» статье 1 'Статья 2' и т.д.

и мой 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); 

есть ли динамический способ создать это?

ответ

9

Наконец получил это работает ..

В случаи, когда я получил, статья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); 
    }); 

}; 
+0

Я получил его, чтобы работать без него? в конце маршрута, какое-либо значение? –

+0

@AdamF '' 'делает' req.params.name' или ': name' необязательным. например Вышеуказанный путь соответствует '/' пустым ': name' и '/ article2', но не'/abc'. –

+0

Вы можете найти этот онлайн-экспресс-тестер Express (http://forbeslindesay.github.io/express-route-tester/). –

29

Я хотел бы сделать то же самое вы сделали для /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); 
    }); 
}); 

Это то, что вы имели в виду?

+0

Да, я ищу что-то подобное, но я получаю сообщение об ошибке: Ошибка: Не удалось просмотреть просмотр "/ article" в каталоге представлений "C: \ ..... (я использовал foreach) –

+0

Вы уверены, что 'name' - это то, что вы ожидаете? Возможно, вы захотите его зарегистрировать и посмотреть, есть ли это. –

+0

@wasiim_dev Вам нужно добавить' app.set ('views', __dirname + '/ views'); 'ближе к началу вашего кода, если ваши представления находятся в подкаталоге' views' относительно того, где находится ваш код Express. По умолчанию Express ищет путь относительно текущего рабочего каталога *. – mscdex

2

Вот несколько других решений:

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

, это может частично решить проблему. Как насчет того, есть ли у меня вместо статьи - (подсказка, рецепт и т. Д. И т. Д.) Здесь более 100 возможностей. Я хочу что-то, что можно использовать в качестве общего для * предметов, следующих за '/' –

2

Есть много способов реализации динамического экспресс-маршруты. Это в значительной степени зависит от структуры, которую вы реализовали в своем проекте, здесь я оставляю пример динамических маршрутов, и я надеюсь, что это будет полезно.

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

создать новый модуль под названием: jadewalker. Он автоматически создаст код маршрутизатора.

Мы можем просто добавить комментарий jadewalker к вашему jade или pug.

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

И добавьте этот модуль в наш app. Это все.

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

Мы можем посетить наш нефритовый файл по адресу http://localhost:3000/b/abc. (^ ∀ ^)

Смежные вопросы