aspnet prerendering を使用してサーバー側のレンダリングを使用して、aspnet コアで実行されている react-redux アプリがあります。
愚かなタイプミスのために、子コンポーネントで未定義の小道具にアクセスしようとするプログラミングエラーを犯したとしましょう。
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
}
サーバー レンダリングがなければ、次のようなエラーが発生します: cannot access something of undefined at line x:yy しかし、サーバー レンダリングを使用すると、次のようになります。
リクエストの処理中に未処理の例外が発生しました。
例外: ノード モジュールの呼び出しが次のエラーで失敗しました: 'ClientApp/src/boot-server' のブート関数が解決または拒否しない promise を返したため、30000 ミリ秒後に事前レンダリングがタイムアウトしました。ブート関数が常にその promise を解決または拒否することを確認してください。「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
});
}