我有一个问题,即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));
每个功能(车辆路线,staticCostsRoute等)的构造都相同。
例如车辆路线:
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;
};
例如staticCostsRoutes:
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 。
答案 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;
};
staticCostsRoutes.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;
};