【发布时间】:2021-06-24 02:11:48
【问题描述】:
所以我有一个小的 Next.js 应用程序,它的页面只允许登录用户使用。那里没什么特别的。 为了管理经过身份验证的路由,我编写了一个在服务器上重定向的 HOC(称为 withAuth),以避免页面在客户端闪烁。到目前为止它工作得很好,但我有一个问题,我的应用程序是国际化的。所以目前用户只被重定向到默认语言(英语)的登录,但我更愿意选择他们的语言。
不幸的是,useRouter() 仅在客户端可用,所以我的第一种方法没有成功(我应该更清楚)。这是我的代码:
auth.tsx
import redirect from "../utils/redirect";
import * as React from "react";
import { sendData } from "../utils/sendRequest";
export const withAuth = <T extends object>(C: React.ComponentClass<T>) => {
return class AuthComponent extends React.Component<T> {
static async getInitialProps({...ctx}: NextPageContext) {
await sendData('GET','/user').then(response => {
if (!response || !response.success) {
redirect(ctx, "/login");
return {
user: null,
};
}else return {
user: response.user,
};
}).catch(err=>{console.error(err)})
}
render() {
return <C {...this.props} />;
}
};
};
redirect.ts
import Router, {useRouter} from "next/router";
const redirect = (context: any, target: string) => {
let lang = "";
/*if(!(useRouter.locale == "en")){
lang = "/"+useRouter.locale; This wont work
}*/
if (context.res) {
context.res.writeHead(303, { Location: /*lang+*/target });
context.res.end();
} else {
Router.replace(/*lang+*/target);
}
};
export default redirect;
profile.tsx
import * as React from "react";
import { withAuth } from "../components/auth";
//...
class ProfileClass extends React.PureComponent<{}> {
render() {
return <Profile />;
}
}
export default withAuth(ProfileClass);
我很高兴知道如何解决这个问题:) 谢谢!
【问题讨论】:
标签: reactjs typescript redirect next.js server-side-rendering