Alejandro Acevedo
Alejandro Acevedo

Reputation: 83

Fastify Typescript: body unknown

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

Answers (2)

Charlie Martin
Charlie Martin

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

Julien TASSIN
Julien TASSIN

Reputation: 5212

You need to declare the types and type the RouteHandlerMethod and RouteOptions, this way :

The types

type Body = {
  name: string;
  // ...
}

type Response = {
   // ...
}

RouteHandlerMethod

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'
  
  ...
}

RouteOptions

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

Related Questions