摆脱重复的路线

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。