如何在Express.js嵌套路由中读取路由参数?
Express嵌套路由中获取父路由参数的问题
问题场景
主路由配置如下:
export const router = Router(); const appRoutes = [ { path: "/", router: usersRouter, }, { path: "/games/", router: gamesRouter, }, { path: "/games/:gameId/pieces/", router: piecesRouter } ]; appRoutes.forEach((route) => router.use(route.path, route.router));
子路由piecesRouter定义:
import { Router } from "express"; import { index } from "../controllers/pieces.controller"; export const piecesRouter = Router(); piecesRouter.get("/", index);
向/games/4/pieces/发送请求时,能正确匹配到控制器,但打印req对象发现req.params为空对象,无法获取父路由中的gameId参数。
解决方法
方法一:启用mergeParams合并参数
创建子路由时传入{ mergeParams: true }配置,让Express自动将父路由的参数合并到子路由的req.params中:
import { Router } from "express"; import { index } from "../controllers/pieces.controller"; // 开启mergeParams选项 export const piecesRouter = Router({ mergeParams: true }); piecesRouter.get("/", index);
修改后,在index控制器中直接通过req.params.gameId即可获取到4这个值。
方法二:从req.baseUrl解析参数
如果不想修改子路由配置,可以通过解析req.baseUrl来提取参数,比如在控制器中:
export const index = (req, res) => { // 方式1:通过字符串分割提取 const gameId = req.baseUrl.split("/")[2]; // 方式2:通过正则匹配(更健壮) const gameMatch = req.baseUrl.match(/\/games\/([^\/]+)\/pieces/); const gameId = gameMatch ? gameMatch[1] : null; // 后续业务逻辑 };
这种方法适合临时场景,但参数较多时维护成本高,优先推荐第一种方法。
内容的提问来源于stack exchange,提问作者Leo
相关产品推荐
相关产品推荐

