Nextjs服务器操作、prisma和nextauth中的打字错误

fxnxkyjh  于 9个月前  发布在  其他
关注(0)|答案(2)|浏览(137)

我正在学习编程,为了练习,我正在创建一个简单的应用程序,用户可以登录并保存他们的笔记,这是一个带有vercel postgres和prisma的nextjs应用程序,我使用nextauth进行身份验证。
我想我成功地添加了prisma和nextauth。现在我尝试向数据库发出一个简单的请求,添加一个属于用户的注解。
问题是,我得到一个类型脚本错误,说:“类型”字符串|null|“undefined”不可分配给类型“string”。类型“undefined”不可分配给类型“string”。"
它来自下面代码中的email:session?.user?.email行。
有没有人遇到过这样的问题,你是如何解决的?

import { options } from "../../api/auth/[...nextauth]/options";
import { getServerSession } from "next-auth/next";
import db from "../../api/db";

export default async function Page() {
  const session = await getServerSession(options);
  if (!session) return;

  async function addNote() {
    "use server";
    const res = await db.notes.create({
      data: {
        content: "Apple",
        category: "Fruit",
        owner: {
          connect: {
            email: session?.user?.email,
          },
        },
      },
    });
    return res;
  }

  const result = await addNote();
  console.log(result);
  return <></>;
}

字符串
我想我可以事先检查它是否是一个字符串,或者,我可以使用类型Assert,因为我不知道它怎么会不是一个字符串。
但我觉得我这样做是不对的。

ddhy6vgd

ddhy6vgd1#

三种可能的解决方案:1-您可以检查用户和电子邮件,如:

if (session.user && session.user.email){
....
}

字符串
2-或者,如果你确定会有一个用户(比如路由是受保护的..等),你可以使用Assert,比如:

email: (session?.user?.email as strin),


3-或者你可以使用一个固定的字符串值,以防email是undefined或null,比如:

email: session?.user?.email || "",

xoshrz7s

xoshrz7s2#

您的代码似乎要求email的类型为string。您可以转换该类型并使所需类型包括nullundefined,因为电子邮件可能并不总是可用。
目前,一个快速的解决方法是将email: session?.user?.email转换为email: session?.user?.email as unknown as string。这将强制电子邮件的类型为字符串,以便与所需的类型兼容。

相关问题