ExpressJS不会在app.use中触发下一条路线

时间:2019-08-03 16:38:35

标签: javascript node.js express

我有一个问题,即ExpressJS在使用app.use时会触发错误的路由 这是index.js文件中的代码,在这里我组合了所有路由:

const app = express(),
  Router = express.Router();

app.use("/api/vehicle", vehiclesRoutes(Router));
app.use("/api/static-costs", staticCostsRoutes(Router));
app.use("/api/company", companiesRoutes(Router));
app.use("/api/worker", workersRoutes(Router));

每个功能(车辆路线,staticCostsRou​​te等)的构造都相同。

例如车辆路线:

export default (router) => {
  router.get("/:company_id", getVehiclesByCompany);
  router.post("/:company_id", postVehicle);
  router.put("/:company_id/:id", putVehicle);
  router.delete("/:company_id/:id", deleteVehicle);
  return router;
};

例如staticCostsRou​​tes:

export default router => {
  router.get("/:company_id", getStaticCostsByCompany);
  router.post("/:company_id", postStaticCost);
  router.put("/:company_id/:id", putStaticCost);
  router.delete("/:company_id/:id", deleteStaticCost);
  return router;
};

我正在传递Express Router,固定路由并返回Router。

当我尝试致电 PUT / api / static-cost /:company_id /:id 时, 它会触发 PUT / api / vehicles /:company_id /:id

当我交换这两件事时,我提到了一些有趣的事情:

app.use("/api/static-costs", staticCostsRoutes(Router));
app.use("/api/vehicle", vehiclesRoutes(Router));

情况相反,当我尝试致电 PUT / api / vehicle /:company_id /:id 时,它会触发 PUT / api / static-costs /:company_id /: ID

1 个答案:

答案 0 :(得分:2)

问题

您正在创建Router对象,并将相同的引用传递给所有方法。 如果仔细观察所有方法的路由都是相同的,则只有控制器有所不同。

因此,在这种情况下,传递给Router函数的通常引用的vehicleRoutes(Router)getVehiclesByCompany控制器注册到GET /:company_id路由。然后,以下尝试在getStaticCostsByCompany函数中的同一路径上注册staticCostsRoutes(Router)控制器的尝试将被忽略。

解决方案

而不是创建Router并将相同的引用传递给所有函数。 在每个函数中创建一个新的Router对象,然后将其返回,以使它们不会共享相同的引用。

const app = express(),

app.use("/api/vehicle", vehiclesRoutes());
app.use("/api/static-costs", staticCostsRoutes());
app.use("/api/company", companiesRoutes());
app.use("/api/worker", workersRoutes());

vehicleRoutes.js

const router = express.Router();
export default () => {
  router.get("/:company_id", getVehiclesByCompany);
  router.post("/:company_id", postVehicle);
  router.put("/:company_id/:id", putVehicle);
  router.delete("/:company_id/:id", deleteVehicle);
  return router;
};

staticCostsRou​​tes.js

const router = express.Router();
export default () => {
  router.get("/:company_id", getStaticCostsByCompany);
  router.post("/:company_id", postStaticCost);
  router.put("/:company_id/:id", putStaticCost);
  router.delete("/:company_id/:id", deleteStaticCost);
  return router;
};