我有一个在 aspnet 核心上运行的 react-redux 应用程序,使用 aspnet 预渲染进行服务器端渲染。
假设我犯了一个编程错误,在子组件中我尝试访问一个未定义的道具,因为一个愚蠢的错字。
import {Child} from './child'
export class Parent extends React.Component {
render () {
const someProp = {
something: "something"
};
return <Child someProp={someProp} />;
}
}
export class Child extends React.Component {
render() {
return <div>this.props.someprop.something</div>;
//typo: should be someProp instead of someprop
}
如果没有服务器渲染,我会遇到类似于此的错误:无法在 x:yy 行访问未定义的内容但是使用服务器渲染我得到:
处理请求时发生未处理的异常。
异常:调用节点模块失败并出现错误:预渲染在 30000 毫秒后超时,因为“ClientApp/src/boot-server”中的引导函数返回了一个未解析或拒绝的承诺。确保你的引导函数总是解决或拒绝它的承诺。您可以使用“asp-prerender-timeout”标签助手更改超时值。
这使得调试非常困难,当你没有得到任何关于哪里出错的反馈时。如果出现故障,任何人都知道如何设置拒绝?或者甚至可以调试服务器端呈现的代码?
这是我的引导服务器文件,如果您需要更多文件,请告诉我。
import * as React from 'react';
import { Provider } from 'react-redux';
import { renderToString } from 'react-dom/server';
import configureStore from './store/configureStore';
import {getFormById} from './actions/getFormActions';
import {updateUserLocale} from './actions/userLocaleActions';
import FormResponder from './components/mainComponents/formResponder';
export default function renderApp (params) {
return new Promise((resolve, reject) => {
const store = configureStore();
store.dispatch(getFormById(params.data.id, params.data.config, params.data.authenticationToken));
store.dispatch(updateUserLocale(params.data.userLocale));
const app = (
<Provider store={ store }>
<FormResponder />
</Provider>
);
// Perform an initial render that will cause any async tasks (e.g., data access) to begin
renderToString(app);
// Once the tasks are done, we can perform the final render
// We also send the redux store state, so the client can continue execution where the server left off
params.domainTasks.then(() => {
resolve({
html: renderToString(app),
globals: {
initialReduxState: store.getState(),
authenticationToken: params.data.authenticationToken,
config: params.data.config
}
});
}, reject); // Also propagate any errors back into the host application
});
}