关于同构通量应用程序中存储数据填充的问题。 (我正在使用react,alt,iso和node,但理论适用于其他示例)
我有一个需要从api获取数据的通量'store'(http://alt.js.org/docs/stores/):
getState() {
return {
data : makeHttpRequest(url)
}
}
当用户浏览SPA时,将通过http请求加载更多数据。
我希望这个应用程序是同构的,以便我可以将应用程序完整的html呈现,包括最新的数据服务器端,并将其返回给用户,以便快速初始页面加载。
react.renderToString()允许我将应用程序渲染为html,我可以使用alt& iso来播种数据,如:
storeData = { "MyStore" : {"key" : "value"}}; // set data for store
alt.bootstrap(JSON.stringify(storeData || {})); // seed store with data
var content = React.renderToString(React.createElement(myApp)); // render react app to html
问题是我在运行js服务器端时会看到错误,因为商店会想要发出一个它无法做的http请求(因为xmlhttprequest不存在于节点中)
解决这个问题的最佳方法是什么?
我能想到的唯一解决方案是使用以下命令从商店中包装httprequest:
var ExecutionEnvironment = require('react/lib/ExecutionEnvironment');
...
if (ExecutionEnvironment.canUseDOM) {
// make http request
} else {
// do nothing
}
有更好的想法吗?提前谢谢。
答案 0 :(得分:2)
如果您正在运行服务器端,我建议您直接挂接到Ajax库或XMLHttpRequest。只需使用直接从您的数据库或应用程序提供数据的代码即可。
一个简单的例子:
var noop= function(){}
window.XMLHttpRequest= function(){
console.log("xhr created", arguments);
return {
open: function(method, url){
console.log("xhr open", method, url);
// asynchronously respond
setTimeout(function(){
// pull this data from your database/application
this.responseText= JSON.stringify({
foo: "bar"
});
this.status= 200;
this.statusText= "Marvellous";
if(this.onload){
this.onload();
}
// other libs may implement onreadystatechange
}.bind(this), 1)
},
// receive data here
send: function(data){
console.log("xhr send", data);
},
close: noop,
abort: noop,
setRequestHeader: noop,
overrideMimeType: noop,
getAllResponseHeaders: noop,
getResponseHeader: noop,
};
}
$.ajax({
method: "GET",
url: "foo/bar",
dataType: "json",
success: function(data){
console.log("ajax complete", data);
},
error: function(){
console.log("something failed", arguments);
}
});
我在最后5分钟内使用XMLHTTPRequest mdn page
鞭打了这个但是,如果您使用的任何内容不是直接基于XMLHttpRequest或显式节点感知(如superagent),您可能需要对库函数本身进行填充。
要对此代码段执行的其他工作是实现错误和不同的内容类型。