摆脱重复的路线
get rid of duplicate routes
我正在使用 express 和 node.js 创建一个网站。我这里有 2 条路线,例如 /recipe
和 '/recipe/:item'。这里我的 item
是鸡肉或洋葱之类的配料。
这两条路线都会生成 return 中的项目列表。这是我的示例代码。
router.get("/recipeList/:ingredient", async (req, res) => {
let entityId = req.params.ingredient;
try {
const resp = await axios.get(
`myApi&filter={ 'c_ingredients':{ '$contains':"${entityId}"}}`
);
res.render("/recipeList", {
data: resp.data.response,
});
} catch (err) {
console.log(err);
}
});
router.get("/recipeList", async (req, res) => {
let entityId = req.params.ingredient;
try {
const resp = await axios.get(
`myApi`
);
res.render("recipeList", {
data: resp.data.response.entities,
});
} catch (err) {
console.log(err);
}
});
我看到两个块中的代码是相同的(除了 API 端点,我可以在一个简单的条件变量中处理它)。我怎样才能摆脱这个重复的代码并用一个块来处理这两种情况?
如果这两种方法相同,我相信你,如果它不起作用告诉我
const endPoint = async (req, res) => {
let entityId = req.params.ingredient;
try {
const resp = await axios.get(
`myApi`
);
res.render("recipeList", {
data: resp.data.response.entities,
});
} catch (err) {
console.log(err);
}
};
router.get("/recipeList/:ingredient", endPoint);
router.get("/recipeList",endPoint);
您可以在路由器参数中使用问号来告诉 express 它是可选的。
做这样的事情:
router.get("/recipeList/:ingredient?", async (req, res) => {
let URI = `myApi`;
if(req.params.ingredient){
URI = `myApi&filter={ 'c_ingredients':{ '$contains':"${entityId}"}}`;
}
try{
let resp = await axios.get(URI);
res.render("recipeList", {
data: (req.params.ingredient ? resp.data.response : resp.data.response.entities)
});
}catch(err){
res.status(500).end();
}
});
如果没有传递ingredient
参数,则使用默认的url。如果您设置为开启,它会执行您更“复杂”的 http 请求。
请注意,我还没有测试代码,我可能包含很少的 errors/mistakes。
我正在使用 express 和 node.js 创建一个网站。我这里有 2 条路线,例如 /recipe
和 '/recipe/:item'。这里我的 item
是鸡肉或洋葱之类的配料。
这两条路线都会生成 return 中的项目列表。这是我的示例代码。
router.get("/recipeList/:ingredient", async (req, res) => {
let entityId = req.params.ingredient;
try {
const resp = await axios.get(
`myApi&filter={ 'c_ingredients':{ '$contains':"${entityId}"}}`
);
res.render("/recipeList", {
data: resp.data.response,
});
} catch (err) {
console.log(err);
}
});
router.get("/recipeList", async (req, res) => {
let entityId = req.params.ingredient;
try {
const resp = await axios.get(
`myApi`
);
res.render("recipeList", {
data: resp.data.response.entities,
});
} catch (err) {
console.log(err);
}
});
我看到两个块中的代码是相同的(除了 API 端点,我可以在一个简单的条件变量中处理它)。我怎样才能摆脱这个重复的代码并用一个块来处理这两种情况?
如果这两种方法相同,我相信你,如果它不起作用告诉我
const endPoint = async (req, res) => {
let entityId = req.params.ingredient;
try {
const resp = await axios.get(
`myApi`
);
res.render("recipeList", {
data: resp.data.response.entities,
});
} catch (err) {
console.log(err);
}
};
router.get("/recipeList/:ingredient", endPoint);
router.get("/recipeList",endPoint);
您可以在路由器参数中使用问号来告诉 express 它是可选的。
做这样的事情:
router.get("/recipeList/:ingredient?", async (req, res) => {
let URI = `myApi`;
if(req.params.ingredient){
URI = `myApi&filter={ 'c_ingredients':{ '$contains':"${entityId}"}}`;
}
try{
let resp = await axios.get(URI);
res.render("recipeList", {
data: (req.params.ingredient ? resp.data.response : resp.data.response.entities)
});
}catch(err){
res.status(500).end();
}
});
如果没有传递ingredient
参数,则使用默认的url。如果您设置为开启,它会执行您更“复杂”的 http 请求。
请注意,我还没有测试代码,我可能包含很少的 errors/mistakes。