在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