reactjs - Hur validerar man API-svar i RTK Query med Zod-schema?
Jag vill validera API-svaret som jag får från ett REST-API med hjälp av ett Zod-schema. Till exempel har jag detta användarschema och detta API
import { z } from 'zod';
import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react';
const userSchema = z.object({
id: z.string(),
name: z.string(),
age: z.number(),
});
type User = z.infer<typeof userSchema>;
export const userAPI = createApi({
reducerPath: 'userAPI',
baseQuery: fetchBaseQuery({ baseUrl: 'https://some-api/' }),
endpoints: (builder) => ({
getPokemonByName: builder.query<user, string>({
query: (id) => `user/${id}`,
}),
}),
})
Jag vill validera API-svaret mot userSchema med hjälp av Zod. Jag är dock osäker på om jag ska använda funktionen parse eller safeParse som tillhandahålls av Zod.
Kan du vänligen förtydliga var i min kod jag bör utföra svarvalideringen, och om jag bör använda parse eller safeParse för detta scenario?
Svar #1
Du kan bara använda transformResponse som tillhandahålls av Redux Toolkit Query för att validera svaret med hjälp av userSchema. Om svaret inte matchar schemat kommer ett fel att utlösas.
import { z } from 'zod';
import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react';
const userSchema = z.object({
id: z.string(),
name: z.string(),
age: z.number(),
});
type User = z.infer<typeof userSchema>;
export const userAPI = createApi({
reducerPath: 'userAPI',
baseQuery: fetchBaseQuery({ baseUrl: 'https://some-api/' }),
endpoints: (builder) => ({
getPokemonByName: builder.query<User, string>({
query: (id) => `user/${id}`,
transformResponse: (response) => {
userSchema.parse(response);
return response;
},
}),
}),
});
Du kan också skriva en wrapper för baseQuery med zod
