半公式の例
with-cookie-auth
例がでリダイレクトgetInitialProps
。それが有効なパターンかどうかはまだわかりませんが、コードは次のとおりです。
Profile.getInitialProps = async ctx => {
const { token } = nextCookie(ctx)
const apiUrl = getHost(ctx.req) + '/api/profile'
const redirectOnError = () =>
typeof window !== 'undefined'
? Router.push('/login')
: ctx.res.writeHead(302, { Location: '/login' }).end()
try {
const response = await fetch(apiUrl, {
credentials: 'include',
headers: {
Authorization: JSON.stringify({ token }),
},
})
if (response.ok) {
const js = await response.json()
console.log('js', js)
return js
} else {
// https://github.com/developit/unfetch#caveats
return await redirectOnError()
}
} catch (error) {
// Implementation or Network error
return redirectOnError()
}
}
サーバー側とクライアント側の両方を処理します。fetch
コールは、認証トークンを取得し、実際に、あなたは別の関数にこれをカプセル化する場合がありますということです。
代わりに私がアドバイスすること
1.サーバー側のレンダリングでリダイレクトする(SSR中のフラッシュは避けてください)
これは最も一般的なケースです。この時点でリダイレクトして、最初のロード時に最初のページが点滅しないようにします。
MyApp.getInitialProps = async appContext => {
const currentUser = await getCurrentUser(); // define this beforehand
const appProps = await App.getInitialProps(appContext);
// check that we are in SSR mode (NOT static and NOT client-side)
if (typeof window === "undefined" && appContext.ctx.res.writeHead) {
if (!currentUser && !isPublicRoute(appContext.router.pathname)) {
appContext.ctx.res.writeHead(302, { Location: "/account/login" });
appContext.ctx.res.end();
}
}
return { ...appProps, currentUser };
};
2. componentDidMountでリダイレクトします(SSRが無効になっている場合、たとえば静的モードで役立ちます)
これは、クライアント側レンダリングのフォールバックです。
componentDidMount() {
const { currentUser, router } = this.props;
if (!currentUser && !isPublicRoute(router.pathname)) {
Router.push("/account/login");
}
}
静的ビルド中にリダイレクトできないため、静的モードで最初のページをフラッシュすることは避けられませんでしたが、通常のアプローチよりも優れているようです。進行に合わせて編集してみます。
完全な例はこちら
悲しいことにクライアントのみが回答する関連問題