Búsqueda de sitios web

typescript - Cómo especificar un tipo para el cuerpo de la respuesta en un manejador de rutas de Nextjs


interface DefaultResponse<T> {
  success: boolean;
  message?: string;
  user?: T;
}

export async function POST(req: Request) {
  const body: Pick<User, 'email' | 'password'> = await req.json();

  const user = await prisma.user.findUnique({ where: { email: body.email } });

  if (!user) {
    return new Response(
      JSON.stringify({ message: 'email is invalid', success: false }),
    );
  }

  return new Response(
    JSON.stringify({ message: '', sueecss: true, user }),
  ) as DefaultResponse<User>; // This method will not work.
}



El código anterior verifica si el correo electrónico es válido y responde con la información del miembro si coincide.

Al especificar un tipo para el cuerpo como el código anterior, quiero especificar un tipo para advertir un error si 'success' está mal escrito. ¿Cómo puedo especificar un tipo en el cuerpo de la respuesta?

Respuesta #1

Estás intentando convertir el valor de JSON.stringify(...), que es una cadena, a DefaultResponse. Esto causará un error, pero no por la razón que te gustaría.

Recomendaría escribir el tipo de valor de retorno de la función manejadora en su lugar, y usar Response.json() o (NextResponse.json(), así:

import { NextResponse } from "next/server"

interface DefaultResponse<T> {
  success: boolean;
  message?: string;
  user?: T;
}

export async function POST(req: Request): Promise<NextResponse<DefaultResponse<User>>> {
  const body: Pick<User, 'email' | 'password'> = await req.json();

  const user = await prisma.user.findUnique({ where: { email: body.email } });

  if (!user) {
    return NextResponse.json({ message: 'email is invalid', success: false });
  }

  return NextResponse.json({ message: '', sueecss: true, user })
}

También es posible que desees eliminar el campo de contraseña del objeto de usuario recuperado de Prisma, antes de enviarlo de vuelta en la respuesta. Ver: https://www.prisma.io/docs/concepts/components/prisma-client/excluding-fields

Artículos relacionados