6

关于同构通量应用程序中存储数据填充的问题。(我正在使用 react、alt、iso 和 node,但理论适用于其他示例)

我有一个通量“商店”(http://alt.js.org/docs/stores/),需要从 api 获取数据:

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
    }

有更好的想法吗?提前致谢。

4

1 回答 1

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);
    }   
});

http://jsfiddle.net/qs8r8L4f/

我在最后 5 分钟内完成了这个,主要是使用XMLHTTPRequest mdn 页面

但是,如果您使用的不是直接基于 XMLHttpRequest 或显式节点感知的任何东西(如 superagent),您可能需要对库函数本身进行填充。

在这个片段上要做的其他工作是实现错误和不同的内容类型。

于 2015-07-09T15:22:05.897 回答