【发布时间】:2021-04-14 08:13:26
【问题描述】:
我正在为我的应用程序执行 SSR(仅适用于机器人)。
<App/> 的渲染可能会导致找不到路由。
我需要检测该渲染何时以NOT_FOUND 路由结束,以便我可以从我的express 服务器返回res.sendStatus(404);。
我从react-router 的官方文档中关注this tutorial。
我有一个“catch all”路由,它将呈现 404 页面并将该信息添加到 staticContext:
AllRoutes.ts
<Route exact path={"*"} render={({ staticContext }) => {
if (staticContext) {
staticContext.statusCode = 404;
}
return <Page404/>;
}}/>
Route 组件的 render 属性内的 staticContext 对象推断的类型是:
而且它的唯一属性似乎是一个可选的statusCode?: number 属性。
在 SERVER 端,我是这样做的:
ssrApp.tsx
import App from "@src/App";
import { renderToString } from "react-dom/server";
import { StaticRouter } from "react-router-dom";
// ...
const context = {}; // <<< WHAT TO TYPE THIS VARIABLE ?
const appHtml = renderToString(
<StaticRouter location={req.url} context={context}>
<App/>
</StaticRouter>
);
res.status(context.statusCode || 200).send(appHtml);
<StaticRouter> 组件的context 属性的类型是StaticRouterContext:
它接受空的 const context= {}; 属性。但是当我尝试从中访问 statusCode 属性时它会抱怨。
这里提到的所有类型似乎都来自包@types/react-router或@types/react-router-dom,不确定是哪一个。
@types/react-router/index.d.ts
export interface StaticContext {
statusCode?: number;
}
export interface RouteComponentProps<
Params extends { [K in keyof Params]?: string } = {},
C extends StaticContext = StaticContext,
S = H.LocationState
> {
history: H.History<S>;
location: H.Location<S>;
match: match<Params>;
staticContext?: C;
}
如何输入我的context 对象?到目前为止,我还无法从任何地方导入StaticRouterContext 或StaticContext。
【问题讨论】:
标签: reactjs typescript react-router react-router-dom server-side-rendering