为什么Meteor在刷新后会复制数据库对象
Why is Meteor duplicating database objects after a refresh?
我正在构建一个测试应用程序,这是我学习编程时的第一个应用程序,所以如果我的术语不正确,请原谅我。
我正在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的建议:检查你是否有文件,如果没有,就插入。就个人而言,我会在服务器端进行检查和插入,这对未来更安全,因为你应该删除自动发布和不安全的包。
相关文章:
- 使用Clipboard.js复制span文本
- ZeroClipboard-在复制之前添加到值
- 将输入字段中的文本提交到我的数据库,同时将其添加到我的列表中
- 如何在android中使用phonegap将文件从一个文件夹移动/复制到另一个文件夹
- 如何通过php页面将数据库值检索到jquery自动完成框中
- 使用javascript从数据库中添加表
- 通过CSV文件上载更新数据库表
- 平均值:无法将数据更新到数据库
- 如何使用 Angular JS 将数据保存在数据库中
- 复制图像路径以单击它
- Rails-JQueryUIAutcomplete和AJAX不工作,可以't连接到数据库
- 复制当前url按钮-Javascript
- 在谷歌地图上绘制位置数据库
- 为什么Meteor在刷新后会复制数据库对象
- 防止复制/复制 PHP/SQL 数据库
- 将WebSQL数据库复制到其他位置
- 将javascript保存到mysql数据库+复制数据URL
- 如何复制数据从网格到mysql数据库在php
- 基于java的web应用程序从数据库到前端的实时数据复制
- 在webapp中复制SQLite数据库