Skip to main content

Data Validation

You have the option to validate and process the body, query parameters, and headers sent by the client using the Zod, Superstruct, or Yup libraries. While all three are effective options, we highly recommend using Zod for the best developer experience.

  • body: Record<string, any> (always a JSON object)
  • query: Record<string, string>
  • headers: Record<string, string>
  • files: apply(...string[]) (check files)

With Zod

ts
import { handler } from 'bridge';
import z from 'zod';
 
const updateMe = handler({
headers: z.object({ token: z.string().min(5) }),
query: z.object({ _id: z.string() }),
body: z.object({
name: z.string(),
age: z.number().optional(),
type: z.enum(['admin', 'user']).optional(),
address: z.object({
street: z.string(),
})
}),
resolve: (data) => {
(parameter) data: { body: { type?: "admin" | "user" | undefined; age?: number | undefined; name: string; address: { street: string; }; }; query: { _id: string; }; headers: { token: string; }; }
const { body, query, headers } = data;
 
return { success: true };
},
});
ts
import { handler } from 'bridge';
import z from 'zod';
 
const updateMe = handler({
headers: z.object({ token: z.string().min(5) }),
query: z.object({ _id: z.string() }),
body: z.object({
name: z.string(),
age: z.number().optional(),
type: z.enum(['admin', 'user']).optional(),
address: z.object({
street: z.string(),
})
}),
resolve: (data) => {
(parameter) data: { body: { type?: "admin" | "user" | undefined; age?: number | undefined; name: string; address: { street: string; }; }; query: { _id: string; }; headers: { token: string; }; }
const { body, query, headers } = data;
 
return { success: true };
},
});

With Superstruct

ts
import { handler } from 'bridge';
import { object, number, string, enums, size, optional } from 'superstruct';
 
const updateMe = handler({
headers: object({ token: size(string(), 5) }),
query: object({ _id: string() }),
body: object({
name: optional(string()),
age: optional(number()),
type: optional(enums(['admin', 'user'])),
}),
resolve: ({ body, query, headers }) => {
return { success: true };
},
});
ts
import { handler } from 'bridge';
import { object, number, string, enums, size, optional } from 'superstruct';
 
const updateMe = handler({
headers: object({ token: size(string(), 5) }),
query: object({ _id: string() }),
body: object({
name: optional(string()),
age: optional(number()),
type: optional(enums(['admin', 'user'])),
}),
resolve: ({ body, query, headers }) => {
return { success: true };
},
});

With Yup

ts
import { handler } from 'bridge';
import * as yup from 'yup';
 
const updateMe = handler({
headers: yup.object({ token: yup.string().min(5).required() }),
query: yup.object({ _id: yup.string().required() }),
body: yup.object({
name: yup.string(),
age: yup.number(),
type: yup.mixed().oneOf(['admin', 'user']),
}),
resolve: ({ body, query, headers }) => {
return { success: true };
},
});
ts
import { handler } from 'bridge';
import * as yup from 'yup';
 
const updateMe = handler({
headers: yup.object({ token: yup.string().min(5).required() }),
query: yup.object({ _id: yup.string().required() }),
body: yup.object({
name: yup.string(),
age: yup.number(),
type: yup.mixed().oneOf(['admin', 'user']),
}),
resolve: ({ body, query, headers }) => {
return { success: true };
},
});

Error Example

If the data submitted by the user is not in the correct format, Bridge will return a 400 Bad Request error, labeled as "Body|Query|Headers schema validation error". Here is an example using Zod:

json
{
"error": {
"status": 400,
"name": "Body schema validation error",
"data": {
"issues": [
{
"code": "invalid_type",
"expected": "string",
"received": "undefined",
"path": ["name"],
"message": "Required"
}
],
"name": "ZodError"
}
}
}
json
{
"error": {
"status": 400,
"name": "Body schema validation error",
"data": {
"issues": [
{
"code": "invalid_type",
"expected": "string",
"received": "undefined",
"path": ["name"],
"message": "Required"
}
],
"name": "ZodError"
}
}
}