【问题标题】:creating dynamic routes using nodejs使用 nodejs 创建动态路由
【发布时间】:2022-01-04 05:10:06
【问题描述】:

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 文件中的代码,但相同的代码会一次又一次地重复

我在网上搜索并尝试动态创建它但没有成功有什么办法可以减少代码行,因为我已经在上面给出了我的代码

【问题讨论】:

  • 如果您实际上并没有使用模板功能并且只需要将适当的 index.html 文件发送到浏览器,那么您似乎在 URL 和文件系统位置之间有足够的相关性,您可以使用只需几个express.static() 路由,或者您可以编写一个稍微不同版本的express.static() 来从文件系统中获取匹配的文件。

标签: javascript node.js express routes


【解决方案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 => {
  const path = /[^/]*$/.exec(route)[0];
  router.get(route, function (req, res, next) {
    res.render(`${path}/index.html`);
  });
})

【讨论】:

  • 如果有 20 多条路线,那么我必须手动添加 const routes 中的每条路线和路径
  • 当然!我想如果你有一种特殊的方式命名你的路由以将它们映射到文件系统中的文件,你可能会找到一些快捷方式。除了告诉程序哪些路由应该映射到哪些文件之外,您如何想象您的程序会知道这些信息?
  • 是的,我明白了,但我想如果 url、文件和路径名相同,那么我可以同时使用它们,但让我试试这个
  • 是的,如果它们相同,您可以只做一个数组并循环该数组,但据我所知,您的路线有一些细微差别。
  • @Vikas 我更新了我的答案,如果您的路线都具有一致的文件路径约定,则可以为您提供更好的选择。值得注意的是,您必须单独执行任何与模式不匹配的路由(例如,主路由)
猜你喜欢
  • 2023-04-11
  • 2018-09-19
  • 1970-01-01
  • 2019-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-30
相关资源
最近更新 更多