运行 效用函数而不是组件中的登录突变

Running login mutation in utility function instead of component

这个问题可能是我对Apollo/React/GraphQL哲学的误解,但我有点卡在这里。

我正在为我的单页应用程序编写身份验证逻辑。我有一个带有 GraphQL API 的后端,它通过返回 JWT access/refresh 令牌对来对用户进行身份验证。因此,要登录,我需要从我的应用程序向 GraphQL 端点发送一个突变。

我的前端使用 Apollo 客户端。现在我明白了我可以 运行 与 useMutation 的突变,我明白这是如何工作的。但是我也知道 React Hooks 需要在组件的顶部指定。我可以在登录组件中调用这个 useMutation,但这感觉封装不好。

问题是我想要一个单独的 login 实用函数,它接受用户名和密码,将登录变更请求发送到后端,然后 returns 响应。

根据我的理解,我不能在这里使用 useMutation,因为我不在 React 组件中。我当然可以写一个fetch给自己打电话:

export const login = (username, password) => {
    return fetch("/api", {
        method: "POST",
        ...
}

但是当我在 Apollo Client 生态系统中工作时,这感觉不干净。我是不是遗漏了什么,我应该继续进行这些手动获取调用,还是我误解了这里的整个理念?

只要您有权访问 ApolloClient 的实例,就可以调用 mutate method on it directly. You can also pass the client in as a parameter, in which case you might find it helpful get the client instance through the useApolloClient 挂钩。或者,您可以只导出客户端,然后将其直接导入到您的函数中。无论您采用何种方法,只要确保您使用的 ApolloClient 实例与您在应用中其他地方使用的实例相同,即可确保更新正确的缓存。

const client = new ApolloClient({...})

...

const { data, errors } = await client.mutate({...})