在try 使用Java脚本实现原本位于Next JS 12和Pages路由上的代码时,通过使用TypeScrip实现Next JS 13上的代码时遇到错误.

⨯在以下位置检测到默认导出 ‘vibe\src\app\api\auth[...nextauth]\route.ts’.导出命名导出 而是针对每个HTTP方法.

⨯中没有导出任何HTTPS方法 ‘vibe\src\app\api\auth[...nextauth]\route.ts’.导出命名导出 对于每个HTTP方法.[下一次身份验证][错误][客户端取回错误] Https://next-auth.js.org/errors#client_fetch_error意外结束 JSON输入{错误:{

message: 'Unexpected end of JSON input', stack: 'SyntaxError: Unexpected end of JSON input\n' + ' at JSON.parse ()\n' + ' at packageData (node:internal/deps/undici/undici:6403:23)\n' + ' at specConsumeBody (node:internal/deps/undici/undici:6381:14)\n' +
' at process.processTicksAndRejections (node:internal/process/task_queues:95:5)', name: 'SyntaxError'
}, url: 'http://localhost:3000/api/auth/providers',

而是 for each HTTP方法设置.

⨯中没有导出任何HTTPS方法 ‘src\app\api\auth[...nextauth]\route.ts’.导出以下项的命名导出 每个HTTP方法.

这是你可以参考的route.ts个文件,

import NextAuth from "next-auth";
import SpotifyProvider from "next-auth/providers/spotify";
import spotifyApi from "@/lib/spotify";
import { LOGIN_URL } from "@/lib/spotify";

async function refreshAccessToken(token: any) {

  try {
    spotifyApi.setAccessToken(token.accessToken);
    spotifyApi.setRefreshToken(token.refreshToken);

    const { body: refreshedToken } = await spotifyApi.refreshAccessToken();
    console.log("refreshed token is", refreshedToken);

    return {
      ...token,
      accessToken: refreshedToken.access_token,
      accessTokenExpires: refreshedToken.expires_in * 1000 + Date.now(),
      refreshToken: refreshedToken.refresh_token || token.refreshToken,
    };
    

  } catch (error) {
    console.log(error);

    return {
      ...token,
      error: "RefreshAccessTokenError",
    };
  }
}

const authOptions = {

  providers: [
    SpotifyProvider({
      clientId: `${process.env.NEXT_PUBLIC_CLIENT_ID}`,
      clientSecret: `${process.env.NEXT_PUBLIC_CLIENT_SECRET}`,
      authorization: LOGIN_URL,
    }),
    // ...add more providers here
  ],
  secret: process.env.JWT_SECRET,
  pages: {
    signIn: "/login",
  },
  callback: {
    async jwt({
      token,
      account,
      user,
    }: {
      token: any;
      account: any;
      user: any;
    }) {

      if (account && user) {
        return {
          ...token,
          accessToken: account.accessToken,
          refreshToken: account.refreshToken,
          username: account.providerAccountId,
          accessTokenExpires: account.expires_at + 1000,
        };
      }

      if (Date.now() < token.accessTokenExpires) {
        console.log("token is valid");
        return token;
      }

      console.log("token is invalid");
      return await refreshAccessToken(token);
    },

    async session({ session, token }: { session: any; token: any }) {
      session.user.accessToken = token.accessToken;
      session.user.refreshToken = token.refreshToken;
      session.user.username = token.username;

      return session;
    },
  },
};

export default NextAuth(authOptions);

对于整个代码,您可以参考https://github.com/dipesh2508/Vibe

推荐答案

API Routes were replaced with Route Handlers in Next.js v13.
v12: https://nextjs.org/docs/pages/building-your-application/routing/api-routes
v13: https://nextjs.org/docs/app/building-your-application/routing/route-handlers
route.js: https://nextjs.org/docs/app/api-reference/file-conventions/route

您的错误说明您的路由处理程序没有导出任何HTTP方法.例如GET()

This page from the NextAuth documentation showcases each version.
https://next-auth.js.org/configuration/initialization#route-handlers-app
Although note the new docs are at this domain: https://authjs.dev/

希望这个能帮上忙!

Typescript相关问答推荐

动态判断TypScript对象是否具有不带自定义类型保护的键

带有联合参数的静态大小数组

需要使用相同组件重新加载路由变更数据—React TSX

使用动态主体初始化变量

TypeScrip:逐个 case Select 退出noUncheck kedIndexedAccess

表单嵌套太深

错误TS2403:后续变量声明必须具有相同的类型.变量';CRYPTO';的类型必须是';CRYPATO';,但这里的类型是';CRYPATO';

AngularJS服务不会解析传入的Json响应到管道中的模型

如何合并两个泛型对象并获得完整的类型安全结果?

使用泛型识别对象值类型

将超类型断言为类型脚本中的泛型参数

为什么TS2339;TS2339;TS2339:类型A上不存在属性a?

在抽象类构造函数中获取子类型

Rxjs将省略的可观测对象合并到一个数组中

基于属性值的条件类型

替换typescript错误;X类型的表达式可以';t用于索引类型Y;带有未定义

如何正确键入泛型相对记录值类型?

递归JSON类型脚本不接受 node 值中的变量

如何按成员资格排除或 Select 元组?

为什么我的 Typescript 函数中缺少 void 隐式返回类型?