使用Routes和Meteor.userId进行流星服务器渲染

时间:2017-08-07 18:49:17

标签: reactjs meteor react-router

我喜欢在我的Meteor App上使用服务器渲染包,使用React和React-Router v4。但是,onPageLoad事件返回错误:

Error running template: TypeError: Meteor.subscribe is not a function

它在createContainer函数上:

  export default createContainer(() => {
    const postsHandle = Meteor.subscribe('post');
    const loading = !postsHandle.ready();
    const postsList = Post.find({ 'draft': false }).fetch();
    const listExists = !loading && !!postsList;
    return {
      loading,
      listExists,
      posts: listExists ? postsList : [],
    };
  }, PostList);

如果我在服务器上,我不明白如何在null上获得Meteor.subscribe。

有人知道我的问题吗?

谢谢社区!

1 个答案:

答案 0 :(得分:0)

我遇到了同样的错误,因为正如评论中所提到的,没有“Meteor.subscribe”这样的错误。在服务器上,所以当代码通过sink对象传递到服务器上时,会引发错误。 您应该将订阅包装在if(Meteor.isClient)中,即使您的客户端代码仅在客户端上运行。

也可能出现其他问题,假设您正在尝试读取screen.width等类型的属性,则必须像上面那样将其包装

所以你的代码变成了

  export default createContainer(() => {
    var loading,listExists = false
    var postsList= []
    if(Meteor.isClient){
       const postsHandle = Meteor.subscribe('post');
       loading = !postsHandle.ready();
       postsList = Post.find({ 'draft': false }).fetch();
       listExists = !loading && !!postsList;
      }
       return {
         loading,
         listExists,
         posts: listExists ? postsList : [],
       };
     }, PostList);

这应该可以正常工作,只需要处理变量和功能范围