登录后出现此问题: 无法解析 cookie 字符串:[错误:边缘运行时不支持 Node.js 'buffer' 模块。 了解更多信息:https://nextjs.org/docs/messages/node-module-in-edge-runtime]。
中间件.ts:
import { createMiddlewareSupabaseClient } from "@supabase/auth-helpers-nextjs";
import { NextResponse } from "next/server";
import { Database } from "./types/supabase";
import type { NextRequest } from "next/server";
export async function middleware(req: NextRequest) {
const res = NextResponse.next();
const pathname = req.nextUrl.pathname;
const supabase = createMiddlewareSupabaseClient<Database>({ req, res });
const {
data: { session },
} = await supabase.auth.getSession();
if (!session && pathname === "/") {
const url = new URL(req.url);
url.pathname = "/login";
return NextResponse.redirect(url);
}
return res;
}
supabase-auth-provider:
"use client";
import { Profile } from "../../types/collections";
import { Session } from "@supabase/supabase-js";
import { useRouter } from "next/navigation";
import { createContext, useContext, useEffect } from "react";
import useSWR from "swr";
import { useSupabase } from "./supabase-provider";
interface ContextI {
user: Profile | null | undefined;
error: any;
isLoading: boolean;
mutate: any;
signOut: () => Promise<void>;
signInWithGithub: () => Promise<void>;
signInWithEmail: (email: string, password: string) => Promise<string | null>;
}
const Context = createContext<ContextI>({
user: null,
error: null,
isLoading: true,
mutate: null,
signOut: async () => {},
signInWithGithub: async () => {},
signInWithEmail: async (email: string, password: string) => null,
});
export default function SupabaseAuthProvider({
serverSession,
children,
}: {
serverSession?: Session | null;
children: React.ReactNode;
}) {
const { supabase } = useSupabase();
const router = useRouter();
// Get USER
const getUser = async () => {
const { data: user, error } = await supabase
.from("profiles")
.select("*")
.eq("id", serverSession?.user?.id)
.single();
if (error) {
console.log(error);
return null;
} else {
return user;
}
};
const {
data: user,
error,
isLoading,
mutate,
} = useSWR(serverSession ? "profile-context" : null, getUser);
// Sign Out
const signOut = async () => {
await supabase.auth.signOut();
router.push("/login");
};
// Sign-In with Github
const signInWithGithub = async () => {
await supabase.auth.signInWithOAuth({ provider: "github" });
};
// Sign-In with Email
const signInWithEmail = async (email: string, password: string) => {
const { error } = await supabase.auth.signInWithPassword({
email,
password,
});
if (error) {
return error.message;
}
return null;
};
// Refresh the Page to Sync Server and Client
useEffect(() => {
const {
data: { subscription },
} = supabase.auth.onAuthStateChange((event, session) => {
if (session?.access_token !== serverSession?.access_token) {
router.refresh();
}
});
return () => {
subscription.unsubscribe();
};
}, [router, supabase, serverSession?.access_token]);
const exposed: ContextI = {
user,
error,
isLoading,
mutate,
signOut,
signInWithGithub,
signInWithEmail,
};
return <Context.Provider value={exposed}>{children}</Context.Provider>;
}
export const useAuth = () => {
let context = useContext(Context);
if (context === undefined) {
throw new Error("useAuth must be used inside SupabaseAuthProvider");
} else {
return context;
}
};
我尝试检查问题所在,但没有任何相关信息。
最佳答案
当我将 middleware.js 文件放在 app 目录之外时,我遇到了这个问题,也许这就是您遇到的问题。
关于middleware - 使用 Next.js13 和 Next/Supabase 身份验证时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76029908/