diff --git a/packages/qwik-router/src/middleware/request-handler/resolve-request-handlers.ts b/packages/qwik-router/src/middleware/request-handler/resolve-request-handlers.ts index 88aa5705633..4339794768d 100644 --- a/packages/qwik-router/src/middleware/request-handler/resolve-request-handlers.ts +++ b/packages/qwik-router/src/middleware/request-handler/resolve-request-handlers.ts @@ -349,7 +349,7 @@ async function runServerFunction(ev: RequestEvent) { const isDev = getRequestMode(ev) === 'dev'; const data = await ev.parseBody(); if (Array.isArray(data)) { - const [qrl, ...args] = data; + const [qrl, args] = data; if (isQrl(qrl) && qrl.getHash() === serverFnHash) { let result: unknown; try { diff --git a/packages/qwik-router/src/runtime/src/server-functions.ts b/packages/qwik-router/src/runtime/src/server-functions.ts index 9b4d0506389..76d4b45a32d 100644 --- a/packages/qwik-router/src/runtime/src/server-functions.ts +++ b/packages/qwik-router/src/runtime/src/server-functions.ts @@ -457,7 +457,7 @@ export const serverQrl = ( }, signal: abortSignal, }; - const body = await _serialize([qrl, ...filteredArgs]); + const body = await _serialize([qrl, filteredArgs]); if (method === 'GET') { query += `&${QDATA_KEY}=${encodeURIComponent(body)}`; } else { diff --git a/starters/apps/qwikrouter-test/src/routes/(common)/server-func/index.tsx b/starters/apps/qwikrouter-test/src/routes/(common)/server-func/index.tsx index 5e9d8c2bad4..8367df72db8 100644 --- a/starters/apps/qwikrouter-test/src/routes/(common)/server-func/index.tsx +++ b/starters/apps/qwikrouter-test/src/routes/(common)/server-func/index.tsx @@ -38,6 +38,10 @@ const serverFunctionB = server$(async function b() { return this.method; }); +const argsChecker = server$(async function (...args: any[]) { + return args.map(String).join(","); +}); + export const MultipleServerFunctionsInvokedInTask = component$(() => { const methodA = useSignal(""); const methodB = useSignal(""); @@ -61,6 +65,12 @@ export default component$(() => { const userAgentEvent = useSignal(""); const loader = useGetUserAgent(); const streamingLogs = useSignal(""); + const serverArgsReceived = useSignal(""); + const clientArgsReceived = useSignal(""); + + useTask$(async () => { + serverArgsReceived.value = await argsChecker(1, 1, 1); + }); useTask$(async () => { userAgent.value = await getUserAgent(); @@ -100,6 +110,14 @@ export default component$(() => { + ); }); diff --git a/starters/e2e/qwikrouter/server.e2e.ts b/starters/e2e/qwikrouter/server.e2e.ts index 5ea7a0abcf1..f2f6fe3a550 100644 --- a/starters/e2e/qwikrouter/server.e2e.ts +++ b/starters/e2e/qwikrouter/server.e2e.ts @@ -1,6 +1,16 @@ import { expect, test } from "@playwright/test"; test.describe("server$", () => { + /** Checks that arguments weren't deduplicated or added */ + test("receives exactly the args given", async ({ page }) => { + await page.goto("/qwikrouter-test/server-func/"); + const button = page.locator("#args-checker-button"); + + await expect(button).toHaveText("Count Args: 1,1,1 / "); + await button.click(); + await expect(button).toHaveText("Count Args: 1,1,1 / 10,10"); + }); + test("this is available", async ({ page }) => { await page.goto("/qwikrouter-test/server-func/"); const host = page.locator(".server-host");