我想实现以下目标。注册用户时,我创建一个 mongoDB 文档。我将 isFinalized 设置为 false。现在我想检查用户是否将此设置为 false 或 true,如果为 true,则在渲染页面之前我想将其重定向到“/finalize”。但是,我无法将在 next-auth 的会话回调中获取文档与获取会话的中间件结合起来。有一个错误指出 mongoose.connect 不是一个函数(似乎中间件正在尝试使用 mongoose,但我只在那里等待 auth 会话)。我还有其他方法可以做到这一点吗?我希望最好有一个全局解决方案,而不必在每个页面上编写重定向。
如果我执行以下操作:
middleware.ts
:
import { NextRequest } from "next/server";
import { auth } from "./auth";
export default async function middleware(req: NextRequest) {
const session = await auth();
console.log(session);
}
authOptions
:
{
secret: process.env.NEXT_AUTH_SECRET,
callbacks: {
session: async ({ session }) => {
await connectMongoDB();
if (!session.user.email) {
return {
...session,
user: {
...session.user,
hasEmail: false,
isFinalized: false
}
};
}
const userDB = User.findOne({ email: session.user.email });
if (!userDB.isFinalized) {
return {
...session,
user: {
...session.user,
isFinalized: false
}
};
}
return {
...session,
user: {
...session.user,
isFinalized: true
}
};
}
}
}
我只能使用其中一个代码,如果我输入两个终端都会出现错误:
connection error [TypeError: mongoose__WEBPACK_IMPORTED_MODULE_0___default(...).connect is not a function]
[auth][error] JWTSessionError: Read more at https://errors.authjs.dev#jwtsessionerror
[auth][cause]: TypeError: _components_Auth_schema__WEBPACK_IMPORTED_MODULE_3__.User.findOne is not a function
您应该在单独的文件中定义 NextAuth 提供程序配置
config.ts
例如,然后在中间件中导入 config.ts 文件,并重新初始化 NextAuth 实例。
示例:
// config.ts
const config: NextAuthConfig = {
providers: [
GitHubProvider({
clientId: "...",
clientSecret: "...,
}),
...more providers as needed
]
};
export default config;
现在在你的中间件中:
// middleware.ts
const {auth} = NextAuth(config);
export default async function middleware(req: NextRequest) {
const session = await auth();
console.log(session);
}
您可以查看 Next.js Full Stack Kit,它使用 Next-Auth 5,并且为您预先构建了所有这些功能。代码库很干净,是一个很好的学习资源。