Javascript 同构JS-仅限httpRequest客户端

Javascript 同构JS-仅限httpRequest客户端,javascript,node.js,reactjs,flux,isomorphic-javascript,Javascript,Node.js,Reactjs,Flux,Isomorphic Javascript,关于同构flux应用程序中存储数据填充的问题。(我使用react、alt、iso和node,但理论适用于其他示例) 我有一个通量“存储”(store)),需要从api获取数据: getState() { return { data : makeHttpRequest(url) } } 当用户在SPA中导航时,将通过http请求加载更多数据 我希望这个应用程序是同构的,这样我就可以呈现应用程序完整的html,包括最新的数据服务器端,并返回给用户快速初始页面加载 reac

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

我有一个通量“存储”(store)),需要从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
    }

还有更好的主意吗?提前感谢。

如果您运行的是服务器端,我建议您直接挂接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或显式节点感知(如superagent)的任何内容,则可能需要填充库函数本身


此代码段的其他工作是实现错误和不同的内容类型。

请添加更多信息!例如:代码示例、与问题相关的特定错误、添加的代码片段和更多详细信息—如果还有其他问题,请告诉我为什么不使用get请求来获取数据,而不是在后端模拟AJAX?AJAX的全部要点是,您不想在前端重新加载页面。因为您正在进行后端渲染,所以只需向资源发送get/post请求,相应地解析数据并在发送到客户端之前进行渲染。是。问题是,我希望同时呈现“后端”和“前端”数据,因此用户第一次点击页面时,它将被呈现,然后随后的数据加载将来自客户端(稍微过于简化,但足够接近)。客户端渲染可以通过来自客户端的GET请求完成,SS渲染可以通过内部api调用完成,问题是当react store在服务器端运行时,它将尝试进行http调用,而这是它无法做到的(没有按照下面的iSchluff的回答添加某种支持。因此,有一种方法模仿了节点上的xmlhttprequest,它可以有条件地加载。有没有以这种方式“填充”请求的示例?