Javascript 如何用自动发布等待订阅铁路由器?

Javascript 如何用自动发布等待订阅铁路由器?,javascript,meteor,iron-router,Javascript,Meteor,Iron Router,我正在用Meteor开发一个网络应用程序。因为我更关注用户界面和规格,而不是准备生产和安全问题(稍后,在我做了一个好的PoC之后) 我想保留自动发布和不安全的软件包(该死,快去很酷) 我在铁路由器上碰到了一个恼人的问题。 问题很简单,但我找不到办法使它正常工作。有时数据会随机返回未定义 Router.route('/stuff/:_id', { name: 'stuff', template: 'stuff', data: function(){ var stuff = S

我正在用Meteor开发一个网络应用程序。因为我更关注用户界面和规格,而不是准备生产和安全问题(稍后,在我做了一个好的PoC之后)

我想保留自动发布和不安全的软件包(该死,快去很酷)

我在铁路由器上碰到了一个恼人的问题。 问题很简单,但我找不到办法使它正常工作。有时数据会随机返回未定义

Router.route('/stuff/:_id', {
  name: 'stuff',
  template: 'stuff',

  data: function(){
    var stuff = Stuffs.findOne(this.params._id);
    console.log("stuff: ", stuff);
    return {headerTitle: stuff.name, stuffData: stuff};
  },
  action: function(){
    this.render();
  }
});
事实上,这并不是随机的,我猜会发生类似的事情:

当我从应用程序的链接点击此路线时,工作正常(我想数据已经准备好了)

但在页面刷新或url导航时,我可能会有这个恼人的未定义

所有东西都是自动发布的,所以在我的路线中使用waitOn会很奇怪

是否有人遇到了同样的问题并找到了解决方案

当我从应用程序的链接点击此路线时,工作正常(我想数据已经准备好了)

客户端上已存在数据。在这种情况下,Iron Router只执行客户端路由(即,不向服务器发送呼叫)

但在页面刷新或url导航时,我可能会有这个恼人的未定义

在本例中,您实际上是通过HTTP GET请求从服务器端请求数据,您可能没有为其定义任何路由

编辑

关于HTTP GET请求,我错了。似乎无论我们从浏览器加载哪个链接,Meteor服务器都会发送整个构建。在整个构建加载到客户端之后,Iron Router根据URL路径决定加载哪个模板


似乎在页面加载/刷新时,页面在从服务器端接收数据之前被呈现。这是导致
未定义的最可能原因

在客户端数据库上附加此侦听器,以检查服务器何时更新它:

if (Meteor.isClient) {
  Stuffs.find().observe({
    added: function(doc) {
        console.log("Updated Stuffs : ", JSON.stringify(doc));
    }
  });
}
当我从应用程序的链接点击此路线时,工作正常(我想数据已经准备好了)

客户端上已存在数据。在这种情况下,Iron Router只执行客户端路由(即,不向服务器发送呼叫)

但在页面刷新或url导航时,我可能会有这个恼人的未定义

在本例中,您实际上是通过HTTP GET请求从服务器端请求数据,您可能没有为其定义任何路由

编辑

关于HTTP GET请求,我错了。似乎无论我们从浏览器加载哪个链接,Meteor服务器都会发送整个构建。在整个构建加载到客户端之后,Iron Router根据URL路径决定加载哪个模板


似乎在页面加载/刷新时,页面在从服务器端接收数据之前被呈现。这是导致
未定义的最可能原因

在客户端数据库上附加此侦听器,以检查服务器何时更新它:

if (Meteor.isClient) {
  Stuffs.find().observe({
    added: function(doc) {
        console.log("Updated Stuffs : ", JSON.stringify(doc));
    }
  });
}
明白了! 比我想象的要简单

与此相关的问题:

显然流星光标是反应性的,最后我必须做:

Router.route('/stuff/:_id', {
  name: 'stuff',
  template: 'stuff',

  data: function(){
    var stuff = Stuffs.findOne(this.params._id);
    if(stuff){
        console.log("stuff: ", stuff);
        return {headerTitle: stuff.name, stuffData: stuff};
    }
  },
  action: function(){
    this.render();
  }
});
在做任何事情之前,先测试是否有未定义的东西,这样东西就不会被使用->没有错误。更新时,钩子将重新运行,完成

就这样。很酷也很简单,我根本没想过

明白了! 比我想象的要简单

与此相关的问题:

显然流星光标是反应性的,最后我必须做:

Router.route('/stuff/:_id', {
  name: 'stuff',
  template: 'stuff',

  data: function(){
    var stuff = Stuffs.findOne(this.params._id);
    if(stuff){
        console.log("stuff: ", stuff);
        return {headerTitle: stuff.name, stuffData: stuff};
    }
  },
  action: function(){
    this.render();
  }
});
在做任何事情之前,先测试是否有未定义的东西,这样东西就不会被使用->没有错误。更新时,钩子将重新运行,完成


就这样。很酷也很简单,我根本没想过

什么是未定义的?数据,这里的“东西”什么是未定义的?数据,这里的“东西”为什么?这里的所有内容都是自动发布/自动订阅。因此,数据将在mini mongo db上可用,这将允许Stuffs.findOne(this.params._id)工作。有时它在刷新,有时不是。(我认为这是可能的,只是想象不到,他们如何在代码更改时实现手表自动刷新?)。似乎在刷新页面时,它是在收到服务器响应之前呈现的。因此,
未定义
。然而,一旦客户端从服务器接收到数据,页面就会自动更新。谢谢,我将对此进行测试!事实上,我对这个问题相当失望。这就像给这个自动发布/订阅包提供了完美的工具来模拟/PoC,但最后必须对其进行黑客攻击以使其正常工作。我的意思是,我期望在任何情况下都能工作,直到你决定做你自己的系统,我将不得不从我的每个查询中删除这些代码!对我来说,当客户机上的数据可用时(使用蒙古工具观察数据),甚至都不会更新页面。无论如何,我都会投票给你,感谢你的帮助!谢谢为什么?这里的所有内容都是自动发布/自动订阅。因此,数据将在mini mongo db上可用,这将允许Stuffs.findOne(this.params._id)工作。有时它在刷新,有时不是。(我认为这是可能的,只是想象不到,他们如何在代码更改时实现手表自动刷新?)。似乎在刷新页面时,它是在收到服务器响应之前呈现的。因此,
未定义
。然而,一旦客户端从服务器接收到数据,页面就会自动更新。谢谢,我将对此进行测试!事实上,我对这个问题相当失望。这就像给这个自动发布/订阅包提供了完美的工具来模拟/PoC,但最后必须对其进行黑客攻击以使其正常工作。我的意思是,我期望在任何情况下都能工作,直到你决定做你自己的系统,我将不得不从我的每个查询中删除这些代码!T