我正在用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)
我想要像/女性/父母类别选择和/man/父母类别选择这样没有代码重复的路线。我该如何实现这一点,正如你所看到的,路由器的功能如此相似,我应该找到一种方法将性别信息绑定到类似路由器的应用程序上。use("/:gender",genderRouter{gend:gender}(。有什么帮助吗?
您可以使用的一种模式是高阶函数,它是一个返回函数的函数。在这种情况下,它用于创建一个express中间件功能。例如:
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中添加男性/女性路线的方式,因为这一条路线将涵盖这两种性别。