将下一个身份验证谷歌提供商与 Nextjs 13 一起使用时出错

Yus*_*aad -1 typescript reactjs next.js prisma next-auth

我目前正在尝试将 next-auth 与 google 提供商一起使用,并将 prisma 与我的下一个 js 应用程序一起使用,但我收到此错误:

Detected default export in '/MyProject/foodbrain/app/api/auth/[...nextauth]/route.ts'. Export a named export for each HTTP method instead.
Run Code Online (Sandbox Code Playgroud)

随着:

No HTTP methods exported in 'MyProject/foodbrain/app/api/auth/[...nextauth]/route.ts'. Export a named export for each HTTP method.
Run Code Online (Sandbox Code Playgroud)

我的文件夹结构

我的route.ts文件:

import { PrismaAdapter } from "@next-auth/prisma-adapter";
import { PrismaClient } from "@prisma/client";
import NextAuth from "next-auth";
import GoogleProvider from "next-auth/providers/google";

const prisma = new PrismaClient();

export default NextAuth({
  adapter: PrismaAdapter(prisma),
  providers: [
    GoogleProvider({
      clientId: process.env.GOOGLE_CLIENT_ID,
      clientSecret: process.env.GOOGLE_CLIENT_SECRET,
    }),
  ],
});
Run Code Online (Sandbox Code Playgroud)

我在 .env.local 中设置了 GOOGLE_CLIENT_ID 和 GOOGLE_CLIENT_SECRET 变量,我只是不想将它们放在这里,因为它们应该保密。

我的 Login.tsx 文件:

"use client";

import { signIn } from "next-auth/react";

export default function Login() {
  return (
    <nav className="flex justify-end">
      <button
        className="text-black cursor-pointer underline text-lg p-6 hover:text-gray-600"
        onClick={() => signIn()}
      >
        Sign In
      </button>
    </nav>
  );
}
Run Code Online (Sandbox Code Playgroud)

我的 Nav.tsx 文件:

import Login from "./Login";

export default function Navigation() {
  return (
    <nav className="flex justify-end">
      <Login />
    </nav>
  );
};
Run Code Online (Sandbox Code Playgroud)

我的 Prisma 架构:

// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema

generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}

model Account {
  id                 String  @id @default(cuid())
  userId             String
  type               String
  provider           String
  providerAccountId  String
  refresh_token      String?  @db.Text
  access_token       String?  @db.Text
  expires_at         Int?
  token_type         String?
  scope              String?
  id_token           String?  @db.Text
  session_state      String?

  user User @relation(fields: [userId], references: [id], onDelete: Cascade)

  @@unique([provider, providerAccountId])
}

model Session {
  id           String   @id @default(cuid())
  sessionToken String   @unique
  userId       String
  expires      DateTime
  user         User     @relation(fields: [userId], references: [id], onDelete: Cascade)
}

model User {
  id            String    @id @default(cuid())
  name          String?
  email         String?   @unique
  emailVerified DateTime?
  image         String?
  accounts      Account[]
  sessions      Session[]
}

model VerificationToken {
  identifier String
  token      String   @unique
  expires    DateTime

  @@unique([identifier, token])
}
Run Code Online (Sandbox Code Playgroud)

有谁知道我做错了什么?我已经研究这个问题有一段时间了,我似乎无法弄清楚,并且在网上找不到好的答案。任何帮助表示赞赏。

Yus*_*aad 5

我通过改变这个解决了这个问题:

export default NextAuth({
  adapter: PrismaAdapter(prisma),
  providers: [
    GoogleProvider({
      clientId: process.env.GOOGLE_CLIENT_ID,
      clientSecret: process.env.GOOGLE_CLIENT_SECRET,
    }),
  ],
});
Run Code Online (Sandbox Code Playgroud)

对此:

const handler = NextAuth({
  adapter: PrismaAdapter(prisma),
  providers: [
    GoogleProvider({
      clientId: process.env.GOOGLE_CLIENT_ID,
      clientSecret: process.env.GOOGLE_CLIENT_SECRET,
    }),
  ],
});

export { handler as GET, handler as POST };
Run Code Online (Sandbox Code Playgroud)

https://next-auth.js.org/configuration/initialization#route-handlers-app