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 路线的方式,因为这条路线将涵盖这两种性别。
我正在使用 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 路线的方式,因为这条路线将涵盖这两种性别。