React服务器端呈现AJAX setState()-未定义文档
React server-side rendering AJAX setState() - document is not defined
如果没有AJAX请求的响应,我将无法向用户显示任何内容,即我将所有内容都存储在数据库中。我的组件GenericPage.jsx:
export default class GenericPage extends React.Component {
componentWillMount() {
if (this.store && this.onStoreUpdated) this.store.addChangeListener(this.onStoreUpdated);
if (!this.state.page && this.state.pageId) {
this.fetchData();
}
}
onPageStoreUpdated() {
console.info('onPageStoreUpdated');
var page = PageStore.getCurrentObject();
this.setState({page: page, loaded: true}); // the error goes away if I comment this out
}
render() {
...
}
}
My Express JS服务器代码:
server.get('*', function (req, res) {
res.header("Access-Control-Allow-Origin", "*");
match({routes, location: req.url}, (error, redirectLocation, renderProps) => {
if (error) {
res.send(500, error.message)
} else if (redirectLocation) {
res.redirect(302, redirectLocation.pathname + redirectLocation.search)
} else if (renderProps) {
let htmlStr = React.renderToString(<RoutingContext {...renderProps} />);
res.header("Access-Control-Allow-Origin", "*");
res.render('layout', { reactHtml: htmlStr });
} else {
console.log('not found')
res.send(404, 'Not found')
}
})
});
全栈跟踪:
/Users/eric/af/frontend_app/node_modules/react/lib/getActiveElement.js:23
return document.body;
^
ReferenceError: document is not defined
at getActiveElement (/Users/eric/af/frontend_app/node_modules/react/lib/getActiveElement.js:23:12)
at ReactReconcileTransaction.ReactInputSelection.getSelectionInformation (/Users/eric/af/frontend_app/node_modules/react/lib/ReactInputSelection.js:40:23)
at ReactReconcileTransaction.Mixin.initializeAll (/Users/eric/af/frontend_app/node_modules/react/lib/Transaction.js:168:30)
at ReactReconcileTransaction.Mixin.perform (/Users/eric/af/frontend_app/node_modules/react/lib/Transaction.js:133:12)
at ReactUpdatesFlushTransaction.Mixin.perform (/Users/eric/af/frontend_app/node_modules/react/lib/Transaction.js:134:20)
at ReactUpdatesFlushTransaction.assign.perform (/Users/eric/af/frontend_app/node_modules/react/lib/ReactUpdates.js:95:38)
at Object.flushBatchedUpdates (/Users/eric/af/frontend_app/node_modules/react/lib/ReactUpdates.js:175:19)
at Object.wrapper [as flushBatchedUpdates] (/Users/eric/af/frontend_app/node_modules/react/lib/ReactPerf.js:70:21)
at ReactDefaultBatchingStrategyTransaction.Mixin.closeAll (/Users/eric/af/frontend_app/node_modules/react/lib/Transaction.js:207:25)
at ReactDefaultBatchingStrategyTransaction.Mixin.perform (/Users/eric/af/frontend_app/node_modules/react/lib/Transaction.js:148:16)
我使用的是react
0.13.3和react-router
1.0.0
如果只在浏览器中加载数据,请尝试将ComponentWillMount
代码移动到ComponentDidMount
。
事实证明,在服务器端使用React组件是不可能实现的
因此,我将AJAX调用转移到React组件中的componentDidMount
,这样它们就不会影响服务器端
我需要在服务器端获得的数据,在我渲染React组件之前,我在服务器端Node JS代码中获得,在任何React组件之外:
server.get('*', function (req, res) {
res.header("Access-Control-Allow-Origin", "*");
match({routes, location: req.url}, (error, redirectLocation, renderProps) => {
if (renderProps) {
someAsyncHttpRequest(someUrl)
.onSuccess((response) => {
page = response.body;
renderProps.params.page = page;
Dispatcher.dispatch({
actionType: AppAction.PAGE_FETCHED,
data: page
});
});
let htmlStr = React.renderToString(<RoutingContext {...renderProps} />);
res.render('layout', { reactHtml: htmlStr });
}
})
});
相关文章:
- React ReferenceError:未定义文档
- 未定义Javascript文档
- React服务器端呈现AJAX setState()-未定义文档
- 未捕获的引用错误:未在Javascript(Chrome控制台)中定义文档
- Expressjs Mongoose 查找嵌套的嵌入式文档未定义
- 未捕获的引用错误:未定义文档
- UI-router、解析$http未按文档工作
- 未定义文档
- 如何在javascript中定义文档?网络风暴
- Reactjs:未定义文档
- 错误:ReferenceError:未定义文档
- Javascript或PHP中是否有任何画布/布局编辑器用于定义自定义文档布局
- JQuery函数未在文档加载时执行
- ReferenceError:未定义文档(使用纯JavaScript)
- 如何将类属性应用于HTML字符串(未在文档上呈现)
- IE6的Try/Catch块对自定义文档不起作用.someFunction电话
- 找到对象,但未定义文档属性
- Angularjs,ng视图和自定义文档.就绪逻辑
- javascript/jquery中更改了如何定义文档高度
- Javascript innerHTML未写入文档