Как настроить динамические маршруты с помощью функции 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);
});
};
Учитывая, что у меня есть более 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);
Есть ли какой-либо динамический способ создать это?
Ответы
Ответ 1
Наконец-то он работал.
В тех случаях, когда я получил, article1, article2 и т.д.:
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);
});
};
Ответ 2
Я сделал бы то же самое, что и вы для /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);
});
});
Это то, что вы имели в виду?
Ответ 3
Вот несколько других решений:
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();
});
Ответ 4
Существует множество способов реализации динамических экспресс-маршрутов. Это в значительной степени зависит от структуры, которую вы реализовали в своем проекте, здесь я оставляю пример динамических маршрутов, и я надеюсь, что это будет полезно.
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
Создаю новый модуль: jadewalker. Он автоматически создаст код маршрутизатора.
Мы можем просто добавить комментарий jadewalker
к вашему файлу jade
Or 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());
Мы можем посетить наш нефритовый файл по URL http://localhost:3000/b/abc
. (^ ∀ ^)