diff --git a/.chronus/changes/witemple-msft-hsj-router-param-bug-2024-7-7-15-20-46.md b/.chronus/changes/witemple-msft-hsj-router-param-bug-2024-7-7-15-20-46.md new file mode 100644 index 00000000000..e6b2d73577f --- /dev/null +++ b/.chronus/changes/witemple-msft-hsj-router-param-bug-2024-7-7-15-20-46.md @@ -0,0 +1,8 @@ +--- +changeKind: fix +packages: + - typespec-vs + - "@typespec/http-server-javascript" +--- + +Fixed a router bug where paths would sometimes fail to match after a parameter was bound. \ No newline at end of file diff --git a/packages/http-server-javascript/src/http/server/router.ts b/packages/http-server-javascript/src/http/server/router.ts index 6fa8b92e767..e0ce6923801 100644 --- a/packages/http-server-javascript/src/http/server/router.ts +++ b/packages/http-server-javascript/src/http/server/router.ts @@ -248,8 +248,11 @@ function* emitRouteHandler( yield `else {`; const paramName = parameters.length === 1 ? parameters[0] : "param"; - yield ` const [${paramName}, rest] = path.split("/", 1);`; - yield ` path = rest ?? "";`; + const idxName = `__${parseCase(paramName).snakeCase}_idx`; + yield ` let ${idxName} = path.indexOf("/");`; + yield ` ${idxName} = ${idxName} === -1 ? path.length : ${idxName};`; + yield ` const ${paramName} = path.slice(0, ${idxName});`; + yield ` path = path.slice(${idxName});`; if (parameters.length !== 1) { for (const p of parameters) { yield ` const ${parseCase(p).camelCase} = param;`;