在代理

时间:2017-05-18 13:50:10

标签: reactjs proxy react-router single-page-application server-rendering

这是我的问题,

  1. 我有一个前端服务器(apache或nginx),并有一些配置,如proxy_pass" iamurl / server_render /" to" backend.iamurl.com:3000 /"。
  2. 我有一个服务器渲染反应路由器程序在" backend.iamurl.com:3000"服务器。 (反应,反应路由器,koa2和redux)。
  3. 当我在客户端运行它时,一切都是正确的。
  4. 当我在服务器端运行它时,第一次在服务器上发出请求(koa2),我得到ctx.url = /所以路由器匹配。但是当renderToString()完成并且客户端收到了响应时,location.path就是" / server_render",因此react-router不会呈现我想要的内容。
  5. 我知道问题是客户端和服务器端的不同路径,但我认为这种情况(使用代理)在大公司中很常见。当浏览器收到服务器呈现响应时,如何正确运行?

    我正在寻找每个人的想法。

    我的路线代码(客户端和服务器端共享)

        <Route path='/' component={Connector}>
            <Route component={BaseLayout}>
                <IndexRoute components={Home} onEnter={onRouteChange.bind(this, 'home')}/>
                <Route path="articleDetail/:id" components={ArticleDetail} onEnter={onRouteChange.bind(this, 'home')}/>
                <Route path="about" components={About} onEnter={onRouteChange.bind(this, 'about')}/>
                <Route path="joinUs" components={JoinUs} onEnter={onRouteChange.bind(this, 'JoinUs')}/>
            </Route>
        </Route>
    

    这是我的服务器呈现代码

    async function serverRender(ctx, next, renderProps) {
        return new Promise((resolve, reject) => {
            fetchArticlesAPI({API_URL, page: 1}, apiResult => {
                const homeReducer = {
                    "home": {
                        fetched: true,
                        data: apiResult.dataList,
                        times: 1,
                        page: 1
                    }
                };
                const preloadedState = {"home": homeReducer.home};
                const store = createStore(rootReducer, preloadedState);
    
                const html = renderToString(
                    <Provider store={store}>
                        <RouterContext {...renderProps} />
                    </Provider>
                );
    
                const finalState = store.getState();
                const finalStateToClient = JSON.stringify(finalState).replace(/</g, '\\x3c');
    
    
                const body = ctx.render('index', {
                    title: "盘古首页(同构)",
                    dev: argv.env === 'development',
                    finalStateToClient,
                    html
                });
                resolve(body);
            });
        });
    }
    
    export default async (ctx, next) => {
        const {redirectLocation, renderProps} = await _match({routes: routes, location: ctx.url});
    
        if (redirectLocation) {
            ctx.redirect(redirectLocation.pathname + redirectLocation.search)
        } else if (renderProps) {
            await serverRender(ctx, next, renderProps)
        } else {
            await next()
        }
    
    }
    

0 个答案:

没有答案