Node.js/Express 路由代码重复问题

Node.js/Express Routes Code Repetition Problem

我正在使用 Node.js 编写电子商务网站代码。

我注意到在创建路线时一些代码重复,但我找不到如何摆脱它。

男士路线如下:

router.get(`/parent-category-selection`,(req, res, next) => {

categoryRequest.getAllParentCategories('mens', (error, data) => {
  if(!error){
    res.render('category/parentCategorySelection', {parentCategories:data});
  }else {
    res.render('error', {message:'An error occured.'})
  }
})

})

女性路线如下:

router.get(`/parent-category-selection`,(req, res, next) => {

categoryRequest.getAllParentCategories('womens', (error, data) => {
  if(!error){
    res.render('category/parentCategorySelection', {parentCategories:data});
  }else {
    res.render('error', {message:'An error occured.'})
  }
})

})

app.js中的路线:

app.use('/', indexRouter);


app.use('/men', menRouter)

app.use('/women',womenRouter)

app.use('/product',productRouter)

我想要像 /women/parent-category-selection/men/parent-category-selection 这样没有代码重复的路由。 我怎样才能实现这一点,正如您在上面看到的路由器功能非常相似,我应该找到一种方法将性别信息绑定到路由器,如 app.use('/:gender', genderRouter {gender:gender})。有帮助吗?

您可以使用的一种模式是 higher order function,它是 returns 函数的函数。在这种情况下,它用于创建快速中间件功能。例如:

const parentCategorySelectionHandler = (gender) => (req, res) =>
  categoryRequest.getAllParentCategories(gender, (error, data) => {
    if (!error) {
      res.render("category/parentCategorySelection", {
        parentCategories: data,
      });
    } else {
      res.render("error", { message: "An error occured." });
    }
  });

可以这样使用:

router.get(`/parent-category-selection`, parentCategorySelectionHandler("men"));

如果你想从 URL 中获取性别,如你所建议的,你可以将其更改为以下内容。

中间件

const parentCategorySelectionHandler = (req, res) =>
  categoryRequest.getAllParentCategories(req.params.gender, (error, data) => {
    if (!error) {
      res.render("category/parentCategorySelection", {
        parentCategories: data,
      });
    } else {
      res.render("error", { message: "An error occured." });
    }
  });

用法

router.get(`/parent-category-selection/:gender`, parentCategorySelectionHandler);

那么您需要更改在 app.js 中添加 men/women 路线的方式,因为这条路线将涵盖这两种性别。