ตัวอย่างกึ่งทางการ
ตัวอย่างการเปลี่ยนเส้นทางใน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. Redirect ใน componentDidMount (มีประโยชน์เมื่อปิดใช้งาน SSR เช่นในโหมดคงที่)
นี่คือทางเลือกสำหรับการเรนเดอร์ฝั่งไคลเอ็นต์
componentDidMount() {
const { currentUser, router } = this.props;
if (!currentUser && !isPublicRoute(router.pathname)) {
Router.push("/account/login");
}
}
ฉันไม่สามารถหลีกเลี่ยงการกระพริบหน้าเริ่มต้นในโหมดคงที่เพิ่มจุดนี้เพราะคุณไม่สามารถเปลี่ยนเส้นทางในระหว่างการสร้างคงที่ แต่ดูเหมือนว่าดีกว่าวิธีปกติ ฉันจะพยายามแก้ไขเมื่อฉันดำเนินการไป
ตัวอย่างเต็มอยู่ที่นี่
ปัญหาที่เกี่ยวข้องซึ่งจบลงด้วยการตอบลูกค้าเพียงเศร้า