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

Express中/api/tshirts/other路由返回null且未触发方法的问题

问题原因及解决方案

核心问题:路由匹配顺序导致请求被错误捕获

Express的路由是从上到下按顺序匹配的,当你访问/api/tshirts/other时,会先被前面的/:productId动态路由匹配——因为动态参数:productId会把other当成一个合法的参数值,请求直接进入tshirtsController.getTShirtByProductId处理,而不会落到后面的/other路由。

如果getTShirtByProductId控制器中没找到对应数据,又没正确处理这种情况(比如没返回404,而是返回null或没正确结束响应),就会出现你看到的:控制台无/other路由的日志、响应体为null但状态码200的情况。

解决方案:调整路由定义顺序

把静态路由(像/findProductsByIds、/other这种固定路径的路由)放在动态路由前面,确保固定路径先被匹配:

// tshirts.ts 调整后
router.get("/", tshirtsController.getTShirts)

router.get("/findProductsByIds", tshirtsController.getTShirtsByIds)

router.get("/other", (req, res) => {
  console.log("here")
  res.json({msg: "hello"})
})

// 动态路由放到最后
router.get("/:productId", tshirtsController.getTShirtByProductId)

这样当请求/api/tshirts/other时,会先匹配到/other路由,执行对应的处理逻辑;只有当路径是类似/api/tshirts/123这种动态参数形式时,才会触发/:productId路由。

另外建议检查tshirtsController.getTShirtByProductId的实现,确保当找不到对应产品时返回正确的404响应,避免出现无意义的200+null情况:

// 示例:完善getTShirtByProductId逻辑
async function getTShirtByProductId(req, res) {
  const productId = req.params.productId;
  const tshirt = await TshirtModel.findById(productId);
  if (!tshirt) {
    return res.status(404).json({ error: "商品不存在" });
  }
  res.json(tshirt);
}

内容的提问来源于stack exchange,提问作者m_jdm35

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 06:25:24