Jos*_*ddy 2 mongodb reactjs next.js
因此,我一直在尝试将 Next Auth 集成到全栈 NextJS Web 应用程序中。我已经使用 JWT 处理了登录,并且由于使用带有 Next Auth 的凭证登录类型,因此将会话存储在浏览器上。我已经设法让登录正常工作,但是我现在正在尝试保护我的 API 路由以从 MongoDB 检索用户的基本数据。相关文件如下,但是,我遇到了一个错误unstable_getServerSession()(至少根据跟踪),该错误表明options.providers不可迭代。我无法理解这一点,因为我已将其创建为数组......
任何帮助将不胜感激!
[...nextauth].js
import NextAuth from 'next-auth';
import CredentialsProvider from 'next-auth/providers/credentials';
import clientPromise from '../../../lib/mongodb'
import { compare } from 'bcryptjs'
export default NextAuth({
session: {
strategy: "jwt"
},
providers: [
CredentialsProvider({
name: "Email and Password",
credentials: {
email: { label: "Email", type: "email", placeholder: "Email Address" },
password: { label: "Password", type: "password", placeholder: "Password" }
},
async authorize(credentials, req) {
const db = (await clientPromise).db();
const employees = db.collection('employees');
const res = await employees.findOne({
email: credentials.email
});
if (!res) {
throw new Error('No user found with those details');
}
const checkPassword = await compare(credentials.password, res.password);
if (!checkPassword) {
throw new Error('Incorrect username or password');
}
return res;
}
}),
],
pages: {
signIn: "/signin"
}
})
Run Code Online (Sandbox Code Playgroud)
getEmployeeData.js
import { unstable_getServerSession } from "next-auth/next"
import authOptions from "../auth/[...nextauth]"
import clientPromise from "../../../lib/mongodb";
export default async function getEmployeeData(req, res) {
const session = await unstable_getServerSession(req, res, authOptions);
if (session) {
res.status(200).json({ success: "You got it!" });
}
}
Run Code Online (Sandbox Code Playgroud)
错误信息
error - TypeError: options.providers is not iterable
at assertConfig (/Users/MYNAME/Programming/Work/Dan/HR-System/fullstack/node_modules/next-auth/core/lib/assert.js:68:34)
at NextAuthHandler (/Users/MYNAME/Programming/Work/Dan/HR-System/fullstack/node_modules/next-auth/core/index.js:70:52)
at processTicksAndRejections (node:internal/process/task_queues:96:5)
at async unstable_getServerSession (/Users/MYNAME/Programming/Work/Dan/HR-System/fullstack/node_modules/next-auth/next/index.js:79:19)
at async getEmployeeData (webpack-internal:///(api)/./pages/api/employees/getEmployeeData.js:13:21)
at async Object.apiResolver (/Users/MYNAME/Programming/Work/Dan/HR-System/fullstack/node_modules/next/dist/server/api-utils/node.js:366:9)
at async DevServer.runApi (/Users/MYNAME/Programming/Work/Dan/HR-System/fullstack/node_modules/next/dist/server/next-server.js:481:9)
at async Object.fn (/Users/MYNAME/Programming/Work/Dan/HR-System/fullstack/node_modules/next/dist/server/next-server.js:735:37)
at async Router.execute (/Users/MYNAME/Programming/Work/Dan/HR-System/fullstack/node_modules/next/dist/server/router.js:247:36)
at async DevServer.run (/Users/MYNAME/Programming/Work/Dan/HR-System/fullstack/node_modules/next/dist/server/base-server.js:347:29) {
page: '/api/employees/getEmployeeData'
}
error - TypeError: options.providers is not iterable
at assertConfig (/Users/MYNAME/Programming/Work/Dan/HR-System/fullstack/node_modules/next-auth/core/lib/assert.js:68:34)
at NextAuthHandler (/Users/MYNAME/Programming/Work/Dan/HR-System/fullstack/node_modules/next-auth/core/index.js:70:52)
at processTicksAndRejections (node:internal/process/task_queues:96:5)
at async unstable_getServerSession (/Users/MYNAME/Programming/Work/Dan/HR-System/fullstack/node_modules/next-auth/next/index.js:79:19)
at async getEmployeeData (webpack-internal:///(api)/./pages/api/employees/getEmployeeData.js:13:21)
at async Object.apiResolver (/Users/MYNAME/Programming/Work/Dan/HR-System/fullstack/node_modules/next/dist/server/api-utils/node.js:366:9)
at async DevServer.runApi (/Users/MYNAME/Programming/Work/Dan/HR-System/fullstack/node_modules/next/dist/server/next-server.js:481:9)
at async Object.fn (/Users/MYNAME/Programming/Work/Dan/HR-System/fullstack/node_modules/next/dist/server/next-server.js:735:37)
at async Router.execute (/Users/MYNAME/Programming/Work/Dan/HR-System/fullstack/node_modules/next/dist/server/router.js:247:36)
at async DevServer.run (/Users/MYNAME/Programming/Work/Dan/HR-System/fullstack/node_modules/next/dist/server/base-server.js:347:29) {
page: '/api/employees/getEmployeeData'
}
error - TypeError: options.providers is not iterable
at assertConfig (/Users/MYNAME/Programming/Work/Dan/HR-System/fullstack/node_modules/next-auth/core/lib/assert.js:68:34)
at NextAuthHandler (/Users/MYNAME/Programming/Work/Dan/HR-System/fullstack/node_modules/next-auth/core/index.js:70:52)
at processTicksAndRejections (node:internal/process/task_queues:96:5)
at async unstable_getServerSession (/Users/MYNAME/Programming/Work/Dan/HR-System/fullstack/node_modules/next-auth/next/index.js:79:19)
at async getEmployeeData (webpack-internal:///(api)/./pages/api/employees/getEmployeeData.js:13:21)
at async Object.apiResolver (/Users/MYNAME/Programming/Work/Dan/HR-System/fullstack/node_modules/next/dist/server/api-utils/node.js:366:9)
at async DevServer.runApi (/Users/MYNAME/Programming/Work/Dan/HR-System/fullstack/node_modules/next/dist/server/next-server.js:481:9)
at async Object.fn (/Users/MYNAME/Programming/Work/Dan/HR-System/fullstack/node_modules/next/dist/server/next-server.js:735:37)
at async Router.execute (/Users/MYNAME/Programming/Work/Dan/HR-System/fullstack/node_modules/next/dist/server/router.js:247:36)
at async DevServer.run (/Users/MYNAME/Programming/Work/Dan/HR-System/fullstack/node_modules/next/dist/server/base-server.js:347:29) {
page: '/api/employees/getEmployeeData'
Run Code Online (Sandbox Code Playgroud)
我知道,同样的错误重复了三次,也不知道为什么会发生......
小智 5
您必须单独导出 authOptions 并将它们作为export default NextAuth(authOptions)参数应用到 。
这是您的代码的解决方案:
export const authOptions = {
session: {
strategy: "jwt"
},
providers: [
CredentialsProvider({
name: "Email and Password",
credentials: {
email: { label: "Email", type: "email", placeholder: "Email Address" },
password: { label: "Password", type: "password", placeholder: "Password" }
},
async authorize(credentials, req) {
const db = (await clientPromise).db();
const employees = db.collection('employees');
const res = await employees.findOne({
email: credentials.email
});
if (!res) {
throw new Error('No user found with those details');
}
const checkPassword = await compare(credentials.password, res.password);
if (!checkPassword) {
throw new Error('Incorrect username or password');
}
return res;
}
}),
],
pages: {
signIn: "/signin"
}
}
export default NextAuth(authOptions)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2571 次 |
| 最近记录: |