如何在Nextjs路由处理程序中为响应体指定类型

pkbketx9  于 2023-11-18  发布在  其他
关注(0)|答案(1)|浏览(136)
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.
}

字符串
上面的代码检查电子邮件是否有效,如果匹配,则使用成员信息进行响应。
通过为响应体指定一个类型与上面的代码一样,我想指定一个类型,如果success拼写错误,则会发出错误警告。

ej83mcc0

ej83mcc01#

你试图将JSON.stringify(...)的值转换为DefaultResponse,这是一个字符串。这将出错,但不是你想要的原因。
我建议键入处理程序函数的返回值,并使用Response.json()或(NextResponse.json(),如下所示:

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 })
}

字符串
此外,您可能希望在将密码字段发送回响应之前,从Prisma检索的用户对象中删除该字段。请参阅:https://www.prisma.io/docs/concepts/components/prisma-client/excluding-fields

相关问题