为什么Meteor在刷新后会复制数据库对象

Why is Meteor duplicating database objects after a refresh?

本文关键字:复制 数据库 对象 Meteor 刷新 为什么      更新时间:2023-09-26

我正在构建一个测试应用程序,这是我学习编程时的第一个应用程序,所以如果我的术语不正确,请原谅我。

我正在Chromium浏览器版本30.0.1599.114 中运行Meteor 0.6.6.3版本

我已经将假冒产品添加到一个集合中,如下面的代码所示。然而,由于某种原因,当我刷新浏览器时,或者在服务器重新启动后,每个产品都会在浏览器中复制,因此它会显示两个锤子、两个扳手等。我唯一能解决这个问题的方法是手动从数据库中删除产品。

我没有看到我的代码有任何问题,所以这与流星有关吗?

如有任何帮助,我们将不胜感激。

JS代码:

var Products = new Meteor.Collection("Products");
if (Meteor.isClient) {
window.Products = Products;
Products.insert({Name : "Hammer", Price : 4.50, InStock : true});
Products.insert({Name : "Wrench", Price : 2.70, InStock : true});
Products.insert({Name : "Screw Driver", Price : 3.00, InStock : false});
Products.insert({Name : "Drill", Price : 5.25, InStock : true});
 Template.Products.ProductArr = function(){
   return Products.find({}, {sort: {Name: 1}});
};
Template.Products.events = {
   "click .Product" : function(){
      if(this.InStock)
         confirm("Would you like to buy a " + this.Name + " for " + this.Price + "$");
      else
         alert("That item is not in stock");
   }
};
}
if (Meteor.isServer) {
  Meteor.startup(function () {
    // code to run on server at startup
  });
}

HTML在下面,只是一个简单的模板。

<head>
  <title>Products</title>
</head>
<body>
  {{> Products}}
</body>
<template name="Products">
   {{#each ProductArr}}
      <div class="Product">
         <h2>{{Name}}</h2>
         <p>Price: ${{Price}}</p>
         {{#if this.InStock}}
            <p>This Item is in stock</p>
         {{else}}
            <p>This Item is currently sold out</p>
         {{/if}}
      </div>
   {{/each}}
</template>

好吧,Meteor正在做你告诉它的事情:在加载页面时插入新产品。如果你只想在数据库为空的情况下发生这种情况,那么你需要添加这样的保护:

if (Products.find().count() === 0) {
  Products.insert({Name : "Hammer", Price : 4.50, InStock : true});
  Products.insert({Name : "Wrench", Price : 2.70, InStock : true});
  Products.insert({Name : "Screw Driver", Price : 3.00, InStock : false});
  Products.insert({Name : "Drill", Price : 5.25, InStock : true});
}

或者,您可以使用追加销售来寻找解决方案(http://docs.meteor.com/#upsert),它只会在不存在的情况下添加新项目。

在第一行中,您要求Meteor在服务器上创建一个Mongo文档,并使用自动pub/sub在客户端上可用。

然后,在客户端上,您要求Meteor插入4个产品。所以Meteor在客户端本地创建它们,然后与服务器同步。所以它们是在服务器上创建的。

如果刷新,Meteor将在客户端和服务器上再次创建它们。如果你一次又一次地刷新,它会插入你刷新的次数。

你可以按照@ChristianF的建议:检查你是否有文件,如果没有,就插入。就个人而言,我会在服务器端进行检查和插入,这对未来更安全,因为你应该删除自动发布和不安全的包。