T
TanStack5w ago
xenial-black

How to access validator in createServerFileRoute?

We can create a server function and add a validator. But I want the validator in createServerFileRoute.
1 Reply
xenial-black
xenial-blackOP5w ago
import { createServerFileRoute } from '@tanstack/react-start/server'
import { json } from '@tanstack/react-start'
import { authMiddleware } from '@/middlewares';
import { Provider } from '@llmchat/core/provider/provider';

export const ServerRoute = createServerFileRoute('/api/provider').methods((api) => ({
POST: api.middleware([authMiddleware]).handler(async ({ request }) => {
// how to validate the json using zodValidator?
const input = await request.json()
await Provider.create(input)
return json({ message: 'ok' })
})
}));
import { createServerFileRoute } from '@tanstack/react-start/server'
import { json } from '@tanstack/react-start'
import { authMiddleware } from '@/middlewares';
import { Provider } from '@llmchat/core/provider/provider';

export const ServerRoute = createServerFileRoute('/api/provider').methods((api) => ({
POST: api.middleware([authMiddleware]).handler(async ({ request }) => {
// how to validate the json using zodValidator?
const input = await request.json()
await Provider.create(input)
return json({ message: 'ok' })
})
}));
I found how to do it. So I created this validation middleware.
export function validationMiddleware<T extends ZodObject>(schema: T) {
return createMiddleware({ type: "request" }).server(
async ({ next, request }) => {
const body = await request.json();
const result = schema.safeParse(body);
if (!result.success) {
setResponseStatus(400);
throw json({ message: "invalid body" });
}
return next({ context: { input: result.data } });
},
);
}
export function validationMiddleware<T extends ZodObject>(schema: T) {
return createMiddleware({ type: "request" }).server(
async ({ next, request }) => {
const body = await request.json();
const result = schema.safeParse(body);
if (!result.success) {
setResponseStatus(400);
throw json({ message: "invalid body" });
}
return next({ context: { input: result.data } });
},
);
}
In my server route file, I added this middleware
export const ServerRoute = createServerFileRoute("/api/provider").methods(
(api) => ({
POST: api
.middleware([authMiddleware, validationMiddleware(Provider.Entity)])
.handler(async ({ context }) => {
await Provider.create(context.input);
return json({ message: "ok" });
}),
}),
);
export const ServerRoute = createServerFileRoute("/api/provider").methods(
(api) => ({
POST: api
.middleware([authMiddleware, validationMiddleware(Provider.Entity)])
.handler(async ({ context }) => {
await Provider.create(context.input);
return json({ message: "ok" });
}),
}),
);

Did you find this page helpful?