You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Cannot GET Router Error排查:通过ID/店铺名获取MongoDB数据失败

问题分析与解决

核心错误原因

你遇到的Cannot GET /shops/Asos错误,本质是路由路径不匹配:

  • 你的路由定义是router.get("/"),仅匹配/shops/这个路径;但你请求的是/shops/Asos,没有对应的路由处理这个带参数的路径。
  • 代码中使用req.params.id和req.params.shopName,但路由未定义这些参数,导致这两个变量始终为undefined,查询逻辑根本无法正确执行。
  • 额外问题:即使路由匹配,若查询不到店铺,shop._doc会触发报错,且错误处理未区分"找不到数据"和"服务器错误"。

修复方案

方案1:使用查询参数(推荐,灵活清晰)

修改代码从req.query获取参数,路由保持/shops/,通过?key=value传递查询条件:

router.get("/", async (req, res) => {
  const { id, shopName } = req.query;
  try {
    let shop;
    // 校验参数是否存在
    if (id) {
      shop = await Shop.findById(id);
    } else if (shopName) {
      shop = await Shop.findOne({ shopName });
    } else {
      return res.status(400).json("请提供id或shopName参数");
    }

    // 处理查询不到数据的情况
    if (!shop) {
      return res.status(404).json("店铺不存在!");
    }

    const { updatedAt, ...others } = shop._doc;
    res.status(200).json(others);
  } catch (err) {
    res.status(500).json("服务器错误");
  }
});

请求示例:

  • 通过ID查询:GET /shops?id=60d21b4667d0d8992e610c85
  • 通过店铺名查询:GET /shops?shopName=Asos

方案2:使用动态路由参数

定义带动态参数的路由,自动匹配/shops/xxx格式的请求,然后判断参数是ID还是店铺名:

router.get("/:identifier", async (req, res) => {
  const { identifier } = req.params;
  try {
    let shop;
    // 先尝试用MongoDB ID查询,失败则用店铺名查询
    try {
      shop = await Shop.findById(identifier);
    } catch (err) {
      shop = await Shop.findOne({ shopName: identifier });
    }

    if (!shop) {
      return res.status(404).json("店铺不存在!");
    }

    const { updatedAt, ...others } = shop._doc;
    res.status(200).json(others);
  } catch (err) {
    res.status(500).json("服务器错误");
  }
});

请求示例:

  • 通过ID查询:GET /shops/60d21b4667d0d8992e610c85
  • 通过店铺名查询:GET /shops/Asos

其他实现方式

拆分独立路由(最直观,便于维护)

分别定义两个路由,明确区分ID和店铺名的查询路径:

// 通过ID查询
router.get("/id/:id", async (req, res) => {
  try {
    const shop = await Shop.findById(req.params.id);
    if (!shop) return res.status(404).json("店铺不存在!");
    const { updatedAt, ...others } = shop._doc;
    res.status(200).json(others);
  } catch (err) {
    res.status(500).json("服务器错误");
  }
});

// 通过店铺名查询
router.get("/name/:shopName", async (req, res) => {
  try {
    const shop = await Shop.findOne({ shopName: req.params.shopName });
    if (!shop) return res.status(404).json("店铺不存在!");
    const { updatedAt, ...others } = shop._doc;
    res.status(200).json(others);
  } catch (err) {
    res.status(500).json("服务器错误");
  }
});

请求示例:

  • 通过ID查询:GET /shops/id/60d21b4667d0d8992e610c85
  • 通过店铺名查询:GET /shops/name/Asos

内容的提问来源于stack exchange,提问作者sultan.h

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 05:45:32