如何解决带有阿波罗客户端的 NextAuth 凭据提供程序?
在 Next.js 中使用 Apollo 客户端使用 NextAuth 进行 GraphQL 身份验证遇到错误
钩子只能在函数体内调用。
import NextAuth from 'next-auth';
import Providers from 'next-auth/providers';
import { useMutation,useApolloClient } from '@apollo/client';
import { LOGIN_MUTATION } from '../../../graphql/mutations';
import { getErrorMessage } from '../../../lib';
export default (req,res) =>
NextAuth(req,res,{
providers: [
Providers.Credentials({
name: 'Credentials',credentials: {
identifier: { label: "Email",type: "text" },password: { label: "Password",type: "password" }
},authorize: async (credentials) => {
const client = useApolloClient();
const [errorMsg,setErrorMsg] = useState();
const [login] = useMutation(LOGIN_MUTATION);
try {
await client.resetStore();
const { data: { login: { user,jwt } } } = await login({
variables: {
identifier: credentials.identifier,password: credentials.password
}
});
if (user) {
return user;
}
} catch (error) {
setErrorMsg(getErrorMessage(error));
}
}
})
],site: process.env.NEXTAUTH_URL || "http://localhost:3000",session: {
jwt: true,maxAge: 1 * 3 * 60 * 60,updateAge: 24 * 60 * 60,},callbacks: {},pages: {
signIn: '/auth/signin'
},debug: process.env.NODE_ENV === "development",secret: process.env.NEXT_PUBLIC_AUTH_SECRET,jwt: {
secret: process.env.NEXT_PUBLIC_JWT_SECRET,}
});
我想知道有没有办法让 apollo 完成这项工作? 感谢您的帮助。
解决方法
正如评论中正确指出的那样,您不能在服务器端代码中使用 hooks。您必须像这样创建一个新的 ApolloClient
:
const client = new ApolloClient()
然后你可以做这样的查询,例如:
const { data } = await client.query({
query: "Your query",variables: { someVariable: true }
});
最好将客户端的创建作为函数移动到单独的外部文件,并在需要时将其导入服务器端代码。例如完成here。
编辑:
正如@rob-art 在评论中正确评论的那样,对于 [mutation][2],代码应该更像这样:const { data } = await client.mutation({
mutation: "Your query",variables: { someVariable: true }
});
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。