diff --git a/rest/nodejs/src/utils/validation.ts b/rest/nodejs/src/utils/validation.ts index 143c293..01fd2df 100644 --- a/rest/nodejs/src/utils/validation.ts +++ b/rest/nodejs/src/utils/validation.ts @@ -35,7 +35,12 @@ const formatPath = (path: (string | number)[]) => { export function prettyValidation( result: | { success: true; data: T; target: string } - | { success: false; error: z.ZodError }, + | { + success: false; + data: T; + target: string; + error: z.ZodError; + }, c: Context ) { if (result.success) { @@ -45,7 +50,7 @@ export function prettyValidation( } else { c.var.logger.warn("Request payload failed validation"); c.var.logger.warn( - `Request payload:\n${JSON.stringify(c.req.json(), null, 2)}` + `Request payload:\n${JSON.stringify(result.data, null, 2)}` ); const prettyError = result.error.issues .map((issue) => { diff --git a/rest/nodejs/test/validation.test.ts b/rest/nodejs/test/validation.test.ts index b8766f8..507db31 100644 --- a/rest/nodejs/test/validation.test.ts +++ b/rest/nodejs/test/validation.test.ts @@ -15,7 +15,11 @@ import assert from "node:assert/strict"; import { test } from "node:test"; -import { IdParamSchema } from "../src/utils/validation"; +import { zValidator } from "@hono/zod-validator"; +import { Hono } from "hono"; +import * as z from "zod"; + +import { IdParamSchema, prettyValidation } from "../src/utils/validation"; test("accepts a required route ID", () => { const result = IdParamSchema.safeParse({ id: "item-123" }); @@ -31,3 +35,34 @@ test("rejects a missing route ID", () => { assert.equal(result.success, false); }); + +test("logs the request payload when JSON validation fails", async () => { + const logLines: string[] = []; + const logger = { + info: (message: string) => logLines.push(String(message)), + warn: (message: string) => logLines.push(String(message)), + } as unknown as typeof console; + const app = new Hono<{ Variables: { logger: typeof console } }>(); + app.use(async (c, next) => { + c.set("logger", logger); + await next(); + }); + app.post( + "/items", + zValidator("json", z.object({ quantity: z.number() }), prettyValidation), + (c) => c.text("created", 201) + ); + + const response = await app.request("/items", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ request_id: "invalid-payload-marker" }), + }); + + assert.equal(response.status, 422); + const payloadLog = logLines.find((line) => + line.startsWith("Request payload:\n") + ); + assert.match(payloadLog ?? "", /"request_id": "invalid-payload-marker"/); + assert.notEqual(payloadLog, "Request payload:\n{}"); +});