Meteor.subscribe函数在使用Meteor';react路由器v4中的服务器渲染

Meteor.subscribe函数在使用Meteor';react路由器v4中的服务器渲染,meteor,server,react-router,Meteor,Server,React Router,我将Meteor的服务器渲染包与React router v4一起使用,但是我得到了一个类型错误,Meteor.subscribe不是一个函数,我无法理解为什么会发生这种情况,或者到底是什么错误 以下是我在客户机上的代码: import React from 'react'; import { Meteor } from 'meteor/meteor'; import { render } from 'react-dom'; import {RenderRoutes} from '../impo

我将Meteor的服务器渲染包与React router v4一起使用,但是我得到了一个类型错误,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'));
});
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);
如果你能弄清楚发生了什么或者我犯了什么错误,那就太好了
谢谢

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

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

另一种解决方案是通过添加
Meteor.subscribe
作为一个函数来对服务器端进行修补,该函数返回一个对象,该对象具有一个始终返回
true
函数:

服务器端:

onPageLoad(接收器=>{
const context={};
//立即准备好服务器上的monkey patching订阅
Meteor.subscribe=(主题)=>({ready:()=>true});
sink.renderIntoElementById(“app”,renderToString(
));
});
这样,您就不需要单独触摸每个组件

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