Reputation: 83
This is my first time using Fastify and I'm facing an issue trying to access to the values in the body in Typescript.
Any idea or suggestion? Thanks!
Update: I would like to avoid to use app.get(...)
etc to simplify the code
This is my code:
App.ts
const buildServer = (options = {}) => {
const app = fastify(options);
app.register(routesApiV1, { prefix: '/api'});
return app;
}
Routes.ts
const routesApiV1: FastifyPluginCallback = (fastify, options, done) => {
fastify.route(userRoute);
done();
}
User.ts
const handler: RouteHandlerMethod = async (req, res) => {
const {
name,
lastName,
dateOfBirth,
addressLine,
zipCode,
city,
country
} = req.body; // Property '...' does not exist on type 'unknown'
...
}
const route: RouteOptions = {
method: 'GET',
url: '/user/:id',
// schema: fastifySchema, Tried but not working
handler,
preValidation,
}
Upvotes: 7
Views: 6708
Reputation: 8406
The FastifyRequest
type is a generic type. You should pass it your body type...
import type { FastifyRequest } from 'fastify'
interface BodyType {
name: string
}
const handler = async (req: FastifyRequest<{ Body: BodyType }>) => {
const { name } = req.body
}
When you use RouteHandlerMethod
, it defaults to typing the request object as FastifyRequest<{ Body: unknown }>
, hence the type of body being unknown
Upvotes: 7
Reputation: 5212
You need to declare the types and type the RouteHandlerMethod
and RouteOptions
, this way :
type Body = {
name: string;
// ...
}
type Response = {
// ...
}
import { RawReplyDefaultExpression, RawRequestDefaultExpression, RawServerDefault, RouteHandler, RouteHandlerMethod } from "fastify";
const handler: RouteHandlerMethod<
RawServerDefault,
RawRequestDefaultExpression,
RawReplyDefaultExpression,
{ Reply: Response; Body: Body }
> = async (req, res) => {
const {
name,
lastName,
dateOfBirth,
addressLine,
zipCode,
city,
country
} = req.body; // Property '...' does not exist on type 'unknown'
...
}
import { RawReplyDefaultExpression, RawRequestDefaultExpression, RawServerDefault, RouteHandler, RouteHandlerMethod, RouteOptions } from "fastify";
const route: RouteOptions<RawServerDefault,
RawRequestDefaultExpression,
RawReplyDefaultExpression,
{ Reply: Response, Body: Body }> = {
method: 'GET',
url: '/user/:id',
// schema: fastifySchema, Tried but not working
handler,
preValidation,
}
Upvotes: -1