создание динамических маршрутов с помощью узлов

#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 Я обновил свой ответ, чтобы дать вам более удобный вариант, если все ваши маршруты имеют согласованный путь к файлам. Примечательно, что вам придется выполнять любые маршруты, которые не соответствуют шаблону (например, домашний маршрут) отдельно