#javascript #node.js #express #routes
Вопрос:
app.js
// Calling Routes require("./routes")(app);
папка маршрутизатора index.js
module.exports = function (app) { app.use("/", require("./all_routes")); }
all_routes.js
var express = require("express"); var router = express.Router(); router.get("/", function (req, res, next) { res.render("home/index.html"); }); //About Page router.get("/about", function (req, res, next) { res.render("about/index.html"); }); //Contact router.get("/contact", function (req, res, next) { res.render("contact/index.html"); }); //product router.get("/product", function (req, res, next) { res.render("product/index.html"); }); //product list router.get("/product/demo-product", function (req, res, next) { res.render("demo-product/index.html"); }); router.get("/product/request-product", function (req, res, next) { res.render("request-product/index.html"); }); //service router.get("/service", function (req, res, next) { res.render("product/index.html"); }); //service list router.get("/service/what-we-do", function (req, res, next) { res.render("what-we-do/index.html"); }); router.get("/service/how-we-do", function (req, res, next) { res.render("how-we-do/index.html"); });
Я пытаюсь уменьшить код в all_routes.js
файле, в котором один и тот же код повторяется снова и снова
Я искал в Интернете и пытался создать его динамически, но безуспешно. Могу ли я каким-либо образом сократить строку кода, как я описал выше свой код
Комментарии:
1. Если вы на самом деле не используя шаблон функции, и вам нужен только соответствующий
index.html
файл, отправляемый в браузер, вы, кажется, уже достаточно корреляция между URL и файловой системе вот что вы могли бы сделать это с помощью всего лишь паруexpress.static()
маршрутов или вы могли бы написать немного другую версиюexpress.static()
, чтобы получить соответствующий файл из файловой системы.
Ответ №1:
Если вы хотите сократить шаблон всех ваших get
маршрутов, один из вариантов-создать объект для сопоставления ваших маршрутов с файлами, которые они загружают. Затем вы можете выполнить итерацию по этому объекту и добавить маршруты к вашему маршрутизатору.
const routes = { "/": "home/index.html", "/about": "about/index.html", "/contact": "contact/index.html" // Add others here } for (let key in routes) { router.get(key, function (req, res, next) { res.render(routes[key]); }); }
Правка: Если ваши маршруты согласуются в том, что index.html
файл всегда будет находиться в каталоге, названном в честь части после последней /
в вашем маршруте, вы потенциально можете использовать массив и некоторую причудливую логику. Только не нарушай правила!
const routes = [ "/contact", "/product", "/product/demo-product", "/product/request-product" ] routes.forEach(route =gt; { const path = /[^/]*$/.exec(route)[0]; router.get(route, function (req, res, next) { res.render(`${path}/index.html`); }); })
Комментарии:
1. если есть более 20 маршрутов, то я должен добавить все маршруты и пути
const routes
вручную2. Конечно! Я предполагаю, что вы потенциально могли бы найти некоторые ярлыки, если бы вы особым образом называли свои маршруты, чтобы сопоставить их с файлами в вашей файловой системе. Помимо указания программе, какие маршруты должны быть сопоставлены с какими файлами, как вы представляли, что ваша программа будет знать эту информацию?
3. да, я понял, но я подумал, что если URL-адрес, файл и путь совпадают, я могу использовать их оба, но позвольте мне попробовать это
4. Да, если они одинаковые, вы могли бы просто создать массив и выполнить цикл по этому массиву, но, насколько я могу судить, в ваших маршрутах есть некоторые нюансы.
5. @Vikas Я обновил свой ответ, чтобы дать вам более удобный вариант, если все ваши маршруты имеют согласованный путь к файлам. Примечательно, что вам придется выполнять любые маршруты, которые не соответствуют шаблону (например, домашний маршрут) отдельно