September 11, 2018
next.jsを使う中でリダイレクト処理を扱う方法に、サーバー側で一工夫する箇所があるのだな、と気づきがあったので記事として残しておきます。
リダイレクト処理
import Router from 'next/router' | |
export default (context, target) => { | |
if (context.res) { | |
// server | |
// 303: "See other" | |
context.res.writeHead(303, { Location: target }) | |
context.res.end() | |
} else { | |
// In the browser, we just pretend like this never even happened ;) | |
Router.replace(target) | |
} | |
} |
リダイレクトされた場合の扱い
if (res && res.finished) {
の箇所がポイント
export default App => { | |
return class Hoc extends React.Component { | |
static async getInitialProps (ctx) { | |
const { Component, router, ctx: { req, res } } = ctx | |
let appProps = {} | |
if (App.getInitialProps) { | |
appProps = await App.getInitialProps(ctx) | |
} | |
if (res && res.finished) { | |
// When redirecting, the response is finished. | |
// No point in continuing to render | |
return {} | |
} | |
return { | |
...appProps | |
} | |
} | |
constructor (props) { | |
super(props) | |
} | |
render () { | |
return <App {...this.props} /> | |
} | |
} | |
} |
使用例
redirect({}, '/signin') |
引用元: https://github.com/zeit/next.js/tree/canary/examples/with-apollo-auth
Written by Ta Toshio who lives and works in Saitama, Japan .You should follow him on Twitter