【问题标题】:Update/Insert to Meteor collection being ignored by server更新/插入流星集合被服务器忽略
【发布时间】:2014-09-05 08:08:16
【问题描述】:

我在客户端和服务器上定义了一个名为“材料”的集合。在一个模板中,我可以正确插入和更新材料。在另一个模板上,我可以插入和更新,但是当我刷新浏览器时,更改会丢失。

这两个视图被调用

view_materials(插入/更新作品)

view_orders(不起作用)

两个模板都将材料集合绑定到它们,如下所示:

//Bind viewOrders to Materials collection
Template.view_order.materials = function () {
return Materials.find();
};

// Bind materialsTemplate to Materials collection
Template.view_materials.materials = function () {
return Materials.find();
};

并且两者都使用下面的函数进行更新。

var docid = Materials.findOne({material_number: newMaterial.material_number});
console.log(docid._id);
Materials.update({_id:docid._id},{$set: {material_qty: total}});

请注意,打印到控制台的 ID 完全匹配。就像我提到的,在 view_orders 上它会在客户端更新片刻,但不会在另一个浏览器窗口中更新,也不会在从服务器重新加载后持续存在。在 view_materials 上它工作得很好。有什么想法吗?

我还在这里部署了一个错误示例: http://upexmple.meteor.com/

并将源代码添加到 github: https://github.com/stereochromatic/update_example

相关代码可见client/views/view_materials/view_materials.js 和 客户端/views/view_orders/view_orders.js

重复错误:

点击库存,在原材料下,输入 A 作为材料编号,输入 -50 作为数量。您将看到它已正确更新。现在单击创建发布并在原材料类型下,选择 A 和 -50 作为数量。您将看到正确的信息打印到控制台,您还可能会看到库存的更改,但刷新后这些更改就消失了。 - 显示引用的文本 -

【问题讨论】:

  • 我在您的服务器代码中没有找到任何 allow 调用。你在使用insecure 包吗?
  • 您好,感谢您的回复。我还没有删除不安全或使用允许/拒绝、发布/订阅。我正在等待将其作为最后一步。

标签: javascript collections meteor


【解决方案1】:

您需要在客户端目录之外定义您的 Meteor 集合。我通常将我的放在 /lib 文件夹中,但仅在客户端定义集合可能会导致问题。

那就动起来

Materials = new Meteor.Collection("materials");

MaterialsLog = new Meteor.Collection("materialsLog");

到客户端/服务器文件夹之外的文件夹中。

【讨论】:

  • 这看起来很有希望并且有道理,但可惜我得到了相同的结果。
  • 我也有同样的怀疑,但他也在服务器上以同样的方式定义集合。
  • 我尝试将集合添加到 /lib/models/Materials.js 的新文件中,并注释掉我在 server.js 中定义它们的位置。出现同样的问题。
  • 有趣...你的控制台有告诉你什么吗?在服务器端还是客户端?
  • 没有错误或任何东西。我正在将内容输出到控制台(如 ._id)以进行调试,但这是奇怪的部分.. id 是正确的并且 find 正在工作。我正在检索数据,只是不允许我在多个模板中写入。
【解决方案2】:

我无法重现该错误。我已经按照你说的做了,但是刷新后更改对我来说并没有消失。我什至可以关闭选项卡并重新打开它,更改仍然存在。

【讨论】:

  • 无法反驳,证据就在页面上。现在我更困惑了!
  • 检查您的浏览器设置。我最近花了整整一周的时间来寻找一个幻像,结果证明它是我的浏览器设置,用于阻止第三方 cookie。例如,请确保您没有为此站点禁用缓存。并尝试使用其他浏览器。
  • 感谢您检查此内容,我尝试了 IE、Firefox 和 Chrome .. 仍然摸不着头脑。确保缓存已启用,但没有骰子。
  • 嗨,Christian,你用哪个浏览器成功了?您是否使用控制台或表单进行了更新?再次感谢
  • 我使用了 Chrome,只是按预期使用了 UI(不是控制台)。
【解决方案3】:

终于想通了……

我用

删除了自动发布包
meteor remove autopublish

然后在 /lib/Materials.js 中定义我的权限(和订阅),如下所示:

// Declare client materials collection
Materials = new Meteor.Collection("materials");

materials = Materials

if (Meteor.isClient) {

    Meteor.subscribe('materials');


}

if (Meteor.isServer) {

    Meteor.publish('materials', function() {
        return materials.find();
});


materials.allow({

    insert: function (document) {
        return true;
    },
    update: function () {
        return true;
    },
    remove: function () {
        return false;
    }

    });

}

感谢所有提供帮助的人。我意识到对于生产应用程序来说,无论如何这都是最佳实践,所以这确实需要在某个时候完成。我原本打算等到最后才删除自动发布、不安全和在发布/订阅、允许/拒绝规则中包装集合,但这个问题有助于加快这项工作:)

【讨论】:

  • 请注意,您不应该在推送到客户端的 js 文件中定义您的允许函数。
【解决方案4】:

使用我上面的代码和文件结构: 请注意我删除了materials = Materials

客户端文件夹:

subscriber.js

Meteor.subscribe('materials');

服务器文件夹

publisher.js

Meteor.publish('materials', function() {
    return Materials.find();

});

allow.js

Materials.allow({

insert: function (document) {
    return true;
},
update: function () {
    return true;
},
remove: function () {
    return false;
}

});

}

收藏夹。这是在客户端和服务器文件夹之外

collections.js

Materials = new Meteor.Collection("materials");

让我知道它是否有效,虽然很晚了,但至少人们可以看到它

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-14
    • 1970-01-01
    • 1970-01-01
    • 2018-06-17
    • 2013-05-20
    • 2013-04-06
    • 2018-10-02
    • 1970-01-01
    相关资源
    最近更新 更多