Ví dụ bán chính thức
Các with-cookie-auth
ví dụ chuyển hướng trong getInitialProps
. Tôi không chắc đó có phải là mẫu hợp lệ hay không, nhưng đây là mã:
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()
}
}
Nó xử lý cả phía máy chủ và phía máy khách. Cuộc fetch
gọi là cuộc gọi thực sự nhận được mã thông báo xác thực, bạn có thể muốn gói nó thành một chức năng riêng biệt.
Thay vào đó tôi sẽ khuyên gì
1. Chuyển hướng trên kết xuất phía máy chủ (tránh flash trong SSR)
Đây là trường hợp phổ biến nhất. Bạn muốn chuyển hướng vào thời điểm này để tránh trang ban đầu nhấp nháy khi tải lần đầu tiên.
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. Chuyển hướng trong thành phầnDidMount (hữu ích khi SSR bị tắt, ví dụ như ở chế độ tĩnh)
Đây là một dự phòng cho kết xuất phía máy khách.
componentDidMount() {
const { currentUser, router } = this.props;
if (!currentUser && !isPublicRoute(router.pathname)) {
Router.push("/account/login");
}
}
Tôi không thể tránh việc flash trang ban đầu ở chế độ tĩnh thêm điểm này, vì bạn không thể chuyển hướng trong quá trình xây dựng tĩnh, nhưng có vẻ tốt hơn các cách tiếp cận thông thường. Tôi sẽ cố gắng chỉnh sửa khi tôi tiến bộ.
Ví dụ đầy đủ là đây
Vấn đề có liên quan, đáng buồn kết thúc với một khách hàng chỉ trả lời