2017-11-19 9 views
2

私のnextJSアプリケーションでは、ユーザーはログイン(ログインページ)を行うことができ、トークンを含むクッキーを作成し、ルート(メインページ)主成分を使用します。ReactJS/nextJS:リダイレクト後にクッキー/プロパティへのアクセスを取得しない

メインコンポーネントでは、getInitialPropsを使用してCookieトークンを取得しています。しかし、これはページをリフレッシュした後にしか動作しません。 今、私はログインしてリダイレクトしています。ボタンをクリックすると、トークンはありません。ページを更新した後、私はトークンを取得します。

どうすればこの問題を回避できますか?私はあなたがする必要がありますので、あなたのクッキーは、ブラウザに保存されているログイン後

ログイン

export class Login extends Component { 
    render() { 
    return (
     <Form id='login' onSubmit={this._onSubmit.bind(this)}> 
     // Input fields 
     </Form> 
    ) 
    } 

    _onSubmit = (event) => { 
    event.preventDefault() 
    const { username, password } = this.state 

    // Sends mutation request to graphQL server 
    this.props.signinUserMutation({ 
     variables: { username, password } 
    }).then(response => { 
     // Returns token 
     const token = response.data.token 
     if (token) { 
     Cookies.set('auth-token', token) 
     this.props.client.resetStore().then(() => { 
      redirect({}, '/main') 
     }) 
     } 
    }) 
    } 
} 

メイン

class Main extends Component { 
    static async getInitialProps (context, apolloClient) { 
    const { req } = context 
    const initProps = {} 

    if (req && req.headers) { 
     const cookies = req.headers.cookie 
     if (typeof cookies === 'string') { 
     const cookiesJSON = jsHttpCookie.parse(cookies) 
     initProps.token = cookiesJSON['auth-token'] 
     } 
    } 

    return initProps 
    } 

    clickIt =() => { 
    console.log(this.props.token) 
    } 

    render() { 
    return (<Button onClick={this.clickIt.bind(this)}) 
    } 
} 
+0

を使用すると仮定し、あなたが見ることができるですあなたのブラウザの開発ツールで設定されたクッキー? Chome:Dev Tools> Application> Cookies – zarcode

+0

@ zarcodeはい、ログインボタンをクリックするとCookieが設定されます。 – user3142695

+0

getInitialPropsでconsole.log(document.cookie)を実行できるので、出力される内容を確認できますか?ルート変更時に 'getInitialProps'がトリガされます。 – zarcode

答えて

1

...私は、サーバー側で何かを間違ってやっていると思いますgetInitialPropsでdocument.cookieを使用してCookie値を取得します。

私はこのコードを理解したよう:

if (req && req.headers) { 
    const cookies = req.headers.cookie 
    if (typeof cookies === 'string') { 
    const cookiesJSON = jsHttpCookie.parse(cookies) 
    initProps.token = cookiesJSON['auth-token'] 
    } 
} 

は、サーバー(ページを更新する)に要求を行う後にのみ起こりますクッキーの値を取得するリクエストヘッダを使用しています。ブラウザのナビゲーションでコードが実行されず、Cookieが取得されない場合それで、あなたはブラウザdocument.cookieから直接クッキーを入手する必要があります。

cookieの代わりにauthトークンを保存するためにlocalStorageを使用することをお勧めします。

componentDidMountは、クッキーの値を取り、Reduxのストアに配置するためにそれを使用する、唯一のブラウザで実行されているので:

componentDidMount() { 
    placeTokenInReduxStoreAction(Cookies.get('auth-token')); 
} 

私はあなたがログインした後、あなたがcookies-js

+0

しかし、document.cookieはログイン直後にトークンを持っています。再読み込み後、ドキュメントが定義されていません – user3142695

+0

これは私のために起こっています:https://github.com/zeit/next.js/issues/2528 – user3142695

+0

サーバ上で意味のあるドキュメントが利用できません。これは良い提案です "あなたのコードをif(process.browser){}にラップするか、componentDidMountフックに入れてみてください" – zarcode