带有spiderable的MeteorJS - 或另一种使App可抓取的解决方案?

时间:2015-11-10 16:14:44

标签: meteor phantomjs iron-router

目前我们正在使用带有iron:路由器软件包的流星应用程序以及用于通过谷歌抓取此应用程序的spiderable和phantomjs。

在我们的特殊情况下,我们有一些路由,在我们将正确的模板渲染到布局之前,我们称之为运行异步的Meteor方法。

在这些路线上测试spiderable时,模板永远不会被渲染,而我们的“加载”模板将成为渲染模板。

我们正在使用/?_ escaped_fragment _ =

进行测试

现在我们正在寻找一种解决方案来告诉Spiderable页面已准备就绪或尚未就绪,因此我们可以控制何时必须呈现页面。

Router.route('/awesome-route', function(){

  // This is how it could look to tell spiderable that it has to wait
  Spiderable.pleaseWait();

  // Render the loading template until our route is ready
  this.render('loading');

  // Waiting for the response of our method
  Meteor.call('data', function(err, resp){
    this.render('awesome', {
      data : resp
    });
    // This is how it could look to tell spiderable we are ready / always be polite
    Spiderable.thanksForWaiting_WeAreReady();
  });
}, {
  name : 'awesome'
});

现在打开localhost:3000 / awesome-route?_escaped_fragment_ =我们只会看到这个模板......

对我们来说,另一个选择是:谷歌是否有任何替代方法可以抓取流媒体应用?

1 个答案:

答案 0 :(得分:1)

由于spiderable将使用服务器上的phantomjs预呈现模板,因此不需要像spiderablePleaseWaitForALittleBitMore_Please这样的特殊方法

您可以向iron:router说明该模板尚未呈现。使用onBeforeAction hook:

Router.route('/awesome-route', {
  name : 'awesome',
  template: "awesome",
  loadingTemplate: "loading",
  onBeforeAction: function(){
      var next = this.next;
      Meteor.call('data', function(err, resp){
         next();
      });
  }
});