Next.js 在 GraphQL 突变内重定向

Posted

技术标签:

【中文标题】Next.js 在 GraphQL 突变内重定向【英文标题】:Next.js redirect inside of GraphQL mutation 【发布时间】:2018-12-24 11:18:26 【问题描述】:

在我的 Next.js 组件中,我向 GraphQL 服务器发出了一个突变请求,成功完成后我需要重定向到另一个页面。我现在怎么做:

import React,  Component  from 'react';
import Router from 'next/router';
import  Mutation  from 'react-apollo';
import  gql  from 'apollo-boost';

const signInMutation = gql`
  mutation signIn($accessToken: String!) 
    signIn(accessToken: $accessToken)
  
`;

export default class extends Component 
  static async getInitialProps( query:  accessToken  ) 
    return  accessToken ;
  

  render() 
    const  accessToken  = this.props;
    return (
      <Mutation mutation=signInMutation ignoreResults>
        signIn => 
          signIn( variables:  accessToken  ).then(() => 
            Router.push(
              pathname: '/user'
            );
          );

          return null;
        
      </Mutation>
    );
  

它工作正常,但 Next.js 抛出错误:You should only use "next/router" inside the client side of your app.。那么,修复错误的最佳方法是什么?

【问题讨论】:

【参考方案1】:

您的 signIn 突变在渲染时执行,当 NextJS 在服务器端渲染您的应用时,执行您的突变。

你应该渲染一个按钮,并且只在点击时触发突变:

import React,  Component  from 'react';
import Router from 'next/router';
import  Mutation  from 'react-apollo';
import  gql  from 'apollo-boost';

const signInMutation = gql`
  mutation signIn($accessToken: String!) 
    signIn(accessToken: $accessToken)
  
`;

export default class extends Component 
  static async getInitialProps( query:  accessToken  ) 
    return  accessToken ;
  

  render() 
    const  accessToken  = this.props;
    return (
      <Mutation mutation=signInMutation ignoreResults>
        signIn => 
          return (
            <button onClick=async () => 
              await signIn( variables:  accessToken  )
              Router.push( pathname: '/user' )
            >Login</button>
          )
        
      </Mutation>
    );
  

【讨论】:

以上是关于Next.js 在 GraphQL 突变内重定向的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有 useMutation 的情况下在 Next.js 中使用 GraphQL 突变

在服务类内重定向?

如何在脚本本身内重定向整个 shell 脚本的输出?

如何在 2 个 OAuth 步骤内重定向时临时存储数据

我应该使用 301 进行站内重定向吗?

如何让nginx对某一个ip在某一时间段内重定向