अर्ध-आधिकारिक उदाहरण
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. रीडायरेक्ट में घटकडिमाउंट (उपयोगी जब SSR अक्षम होता है, जैसे स्थैतिक मोड में)
यह क्लाइंट साइड रेंडरिंग के लिए एक गिरावट है।
componentDidMount() {
const { currentUser, router } = this.props;
if (!currentUser && !isPublicRoute(router.pathname)) {
Router.push("/account/login");
}
}
मैं स्थैतिक मोड में शुरुआती पृष्ठ को चमकाने से नहीं बच सकता था, इस बिंदु को जोड़ दें, क्योंकि आप स्थैतिक निर्माण के दौरान पुनर्निर्देशित नहीं कर सकते, लेकिन यह सामान्य दृष्टिकोणों से बेहतर लगता है। मैं प्रगति करते ही संपादित करने की कोशिश करूँगा।
पूरा उदाहरण यहां है
प्रासंगिक मुद्दा, जो दुख की बात है कि केवल एक ग्राहक के साथ समाप्त होता है