【发布时间】:2022-11-11 01:32:52
【问题描述】:
嗨 stackoverflow 社区,
我需要一些帮助,
我有一个 GraphQL 数据源,我正在使用 apollo 客户端来提取这些数据。 我目前正在开发我的登录功能;我正在使用下一个身份验证凭据提供程序,这是我的凭据提供程序 api 端点
import NextAuth from "next-auth";
import CredentialsProvider from "next-auth/providers/credentials";
import getUser from "src/query/getUser";
export default NextAuth({
session: {
strategy: 'jwt',
},
callbacks: {
async jwt({ token, user}: any) {
if(user?._id) token._id = user._id;
return token;
},
async session({ session, token}: any) {
if(token?._id) session.user._id = token._id;
return session;
},
},
providers: [
CredentialsProvider({
async authorize(credentials: any) {
const email = credentials.email;
// here is where i get the error - Cannot read properties of null (reading 'useContext')
const { data } = await getUser(email);
if(data.password === credentials.password) {
return {
_id: data.id,
name: data.username,
email: data.email,
};
}
throw new Error("Invalid email or password");
},
}),
],
});
这是我的 getUser 钩子
import { useQuery, gql } from '@apollo/client';
const Get_User = gql`
query User($email: String!) {
user(email: $email) {
id
username
email
password
}
}
`;
export default function getUser(email: any) {
const { error, data } = useQuery(Get_User, {variables: {email}});
return {
error,
data,
}
}
我已经通过注释掉 GraphQL getUser 并更改与自身比较的 if 语句 (credential.password === credential.password) 并返回静态写入的数据来验证我的下一个身份验证端点正在工作。
我还验证了我的 getUser 钩子通过在我的登录页面上调用它并让它记录返回到控制台来返回正确的数据。
还检查凭据对象内的数据是否正确传递和访问值。
我想我在这里违反了一些反应钩子法,但我不太清楚如何解决这个问题,任何启示将不胜感激。提前致谢! ^-^
【问题讨论】:
标签: typescript next.js graphql apollo-client next-auth