Skip to content

Commit 2f50042

Browse files
authored
Merge pull request #8098 from QwikDev/fix-serverimBHsargs
fix(router): server$ arg serialization
2 parents d0012c5 + 48711d0 commit 2f50042

File tree

4 files changed

+30
-2
lines changed

4 files changed

+30
-2
lines changed

packages/qwik-router/src/middleware/request-handler/resolve-request-handlers.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -349,7 +349,7 @@ async function runServerFunction(ev: RequestEvent) {
349349
const isDev = getRequestMode(ev) === 'dev';
350350
const data = await ev.parseBody();
351351
if (Array.isArray(data)) {
352-
const [qrl, ...args] = data;
352+
const [qrl, args] = data;
353353
if (isQrl(qrl) && qrl.getHash() === serverFnHash) {
354354
let result: unknown;
355355
try {

packages/qwik-router/src/runtime/src/server-functions.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -457,7 +457,7 @@ export const serverQrl = <T extends ServerFunction>(
457457
},
458458
signal: abortSignal,
459459
};
460-
const body = await _serialize([qrl, ...filteredArgs]);
460+
const body = await _serialize([qrl, filteredArgs]);
461461
if (method === 'GET') {
462462
query += `&${QDATA_KEY}=${encodeURIComponent(body)}`;
463463
} else {

starters/apps/qwikrouter-test/src/routes/(common)/server-func/index.tsx

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,10 @@ const serverFunctionB = server$(async function b() {
3838
return this.method;
3939
});
4040

41+
const argsChecker = server$(async function (...args: any[]) {
42+
return args.map(String).join(",");
43+
});
44+
4145
export const MultipleServerFunctionsInvokedInTask = component$(() => {
4246
const methodA = useSignal("");
4347
const methodB = useSignal("");
@@ -61,6 +65,12 @@ export default component$(() => {
6165
const userAgentEvent = useSignal("");
6266
const loader = useGetUserAgent();
6367
const streamingLogs = useSignal("");
68+
const serverArgsReceived = useSignal("");
69+
const clientArgsReceived = useSignal("");
70+
71+
useTask$(async () => {
72+
serverArgsReceived.value = await argsChecker(1, 1, 1);
73+
});
6474

6575
useTask$(async () => {
6676
userAgent.value = await getUserAgent();
@@ -100,6 +110,14 @@ export default component$(() => {
100110
</button>
101111
</section>
102112
<MultipleServerFunctionsInvokedInTask />
113+
<button
114+
id="args-checker-button"
115+
onClick$={async () => {
116+
clientArgsReceived.value = await argsChecker(10, 10);
117+
}}
118+
>
119+
Count Args: {serverArgsReceived.value} / {clientArgsReceived.value}
120+
</button>
103121
</>
104122
);
105123
});

starters/e2e/qwikrouter/server.e2e.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,16 @@
11
import { expect, test } from "@playwright/test";
22

33
test.describe("server$", () => {
4+
/** Checks that arguments weren't deduplicated or added */
5+
test("receives exactly the args given", async ({ page }) => {
6+
await page.goto("/qwikrouter-test/server-func/");
7+
const button = page.locator("#args-checker-button");
8+
9+
await expect(button).toHaveText("Count Args: 1,1,1 / ");
10+
await button.click();
11+
await expect(button).toHaveText("Count Args: 1,1,1 / 10,10");
12+
});
13+
414
test("this is available", async ({ page }) => {
515
await page.goto("/qwikrouter-test/server-func/");
616
const host = page.locator(".server-host");

0 commit comments

Comments
 (0)