Apollo useMutation,onCompleted完成在登录身份验证期间总是返回true?

Posted

技术标签:

【中文标题】Apollo useMutation,onCompleted完成在登录身份验证期间总是返回true?【英文标题】:Apollo useMutation, onCompleted completion always returning true during Login Authentication? 【发布时间】:2020-07-15 07:04:46 【问题描述】:

我正在执行 GraphQL 突变以尝试登录身份验证,但它每次都返回 true 并存储新用户 AuthToken,即使登录详细信息不正确也是如此。这很奇怪,因为当我在 IDE 中运行 GraphQL 查询时,它可以正常工作。 (即,仅当登录名/密码正确时才成功)。我不确定它是如何生成 auth.Token 和 console.logs “onSuccess”的,不管我在表格中输入了什么。任何帮助将不胜感激,这让我发疯。谢谢。

const LOGIN_USER = gql `
mutation LoginUser 
    login (input: 
    clientMutationId:"uniqueId"
    username: "admin"
    password: "password"
    ) 
        authToken
            user 
                id
                name
            
        

`
const SignIn = (props) => 

const [username, setUsername] = useState('')
const [password, setPassword] = useState('')
const [loggedIn, setLoggedIn] = useState(false)

const onLoginError = () => 
    console.log("onError")
 

const onLoginSuccess = () => 
    console.log("onSuccess")
 

const [loginUser,  loading, error ] = useMutation(LOGIN_USER, 
    onCompleted(login) 
        localStorage.setItem('token', login.authToken)
        onLoginSuccess()
    ,
    onError(error)
        alert(error)
        onLoginError()
    
)

const onLoginSubmit = (event) => 
    event.preventDefault()
    loginUser( variables:
        
            "input": 
                "clientMutationId": "uniqueId",
                "username": username,
                "password": password
            
        
    )

const handleOnChange = (event) => 
    if(event.target.name === "username") 
        setUsername(event.target.value)
     else if(event.target.name === "password") 
        setPassword(event.target.value)
    

return (
<form onSubmit=onLoginSubmit>
<>
                        <input
                            className=styles.formInput
                            name="username" 
                            placeholder="Username or email" 
                            type="text" 
                            value=username
                            onChange=handleOnChange
                        >
                        </input>
                        <input 
                            className=styles.formInput
                            name="password"
                            placeholder="Password" 
                            type="password" 
                            value=password
                            onChange=handleOnChange
                        >
                        </input>
                        <button 
                            className="button is-primary is-pulled-right has-text-weight-semibold"
                            type="submit"
                            disabled=loading
                        ><FiLogIn className=styles.loginIcon/>
                            Login
                        </button>
                    </form>
</>
export default SignIn

【问题讨论】:

您是否在缓存查询? auth token是每次不同还是同一个token? 每次都是同一个token。这很糟糕吗? 当您使用不同的客户端(如 Postman)运行相同的查询时,是否每次都使用不同的令牌?您可能正在前端缓存查询结果。将选项 "useCache": false 传递给突变。我不确定您使用的是什么库,但不是 useCache,它可能是“networkPolicy”。搜索有关防止查询缓存的相关文档。 其实很抱歉,每次都会变。我在这里使用 Apollo apollographql.com/docs/react/data/mutations 但我找不到任何关闭缓存的变量。我有 clearStored 和 cookies 但仍然没有运气。我正在努力让 Postman 处理突变,似乎只做查询。 【参考方案1】:

您的查询包含usernamepassword 的硬编码值,因此无论在表单中输入什么内容,它们每次都会成功登录。您为variables 传递的任何值实际上都会被忽略,因为您实际上并未在查询中使用变量。更新您的查询以实际使用您传入的变量(usernamepassword)。

【讨论】:

啊天啊,你不知道我为此绞尽脑汁。不敢相信我错过了。谢谢丹尼尔!

以上是关于Apollo useMutation,onCompleted完成在登录身份验证期间总是返回true?的主要内容,如果未能解决你的问题,请参考以下文章

Apollo 客户端 useMutation 挂钩中的 refetchQueries 问题

react-apollo-hooks 中的 useMutation 没有传递变量

Apollo 客户端 useQuery 在 useMutation 后不更新数据

UseQuery 在通过 apollo react 使用 useMutations 重定向后不起作用

`data` 在 apollo useMutation Promise 中未定义

Apollo useMutation,onCompleted完成在登录身份验证期间总是返回true?