使用Meteor'的Meteor.subscribe函数的TypeError。服务器渲染反应路由器v4

时间:2017-09-01 08:41:17

标签: meteor server react-router

我正在使用Meteor的服务器渲染包和React路由器v4,但我得到一个TypeError,Meteor.subscribe不是一个函数,我无法弄清楚为什么会发生这种情况或者究竟是什么错

这是我在客户端的代码:

import React from 'react';
import { Meteor } from 'meteor/meteor';
import { render } from 'react-dom';
import {RenderRoutes} from '../imports/api/routes.jsx'
import { onPageLoad } from 'meteor/server-render';
import ReactDOM from 'react-dom';

import {
  Router,
  Route,
  Link,
  Switch
 } from 'react-router-dom'
import createBrowserHistory from 'history/createBrowserHistory'

const history = createBrowserHistory()

const Application = () => (
   <Router history={history}>
      <RenderRoutes/>
   </Router>
);

onPageLoad(()=> {
   ReactDOM.render(<Application/>, document.getElementById('react-root'));
});

在服务器上:

onPageLoad((sink) => {
   const context = {};

   const App = props => (
      <StaticRouter location={props.location} context={context}>
       <RenderRoutes/>
      </StaticRouter>
   );

  sink.renderIntoElementById('app', renderToString(<App location=
   {sink.request.url} />));
  });

我能够使用上面的方法正确地使用一个非常简单的应用程序,它是引入错误的订阅和创建容器,是否有单独的方法来处理它们?

以下是我在客户端订阅的方式:

export default createContainer(() => {
  const handle1 = Meteor.subscribe('categories');
  const handle2 = Meteor.subscribe('subcategories');
  const handle3 = Meteor.subscribe('products');
  const isReady1 = handle1.ready()
  const isReady2 = handle2.ready()
  const isReady3 = handle3.ready()
  return {
    products: isReady3 ? Products.find({}).fetch() : [],
    categories: isReady1 ? Categories.find({}).fetch() : [],
    subcats: isReady2 ? SubCategories.find({}).fetch(): [],
  };
 }, B2C);

如果你能弄清楚发生了什么或者我犯了什么错误,那将是很棒的 感谢

2 个答案:

答案 0 :(得分:1)

删除所有订阅并添加自动发布后,它工作正常,但我觉得这不是一个不正确的解决方案,因为我不希望在任何地方发布所有数据,必须有一个解决方法吗?

解决: 我把所有订阅放在Meteor.isClient块中,所以是订阅不应该在服务器上运行,即使代码存在于客户端而且正在使用它进行服务器渲染,Meteor.isClient块应该提供可能导致服务器渲染错误的代码

答案 1 :(得分:0)

另一种解决方案是通过添加Meteor.subscribe作为返回对象的函数和始终返回ready的{​​{1}}函数来猴子修补服务器端:

服务器端:

true

这样,您无需单独触摸每个组件。