1

我正在使用 SimpleSchema 和 Collection2。

在推送我的应用程序的新版本之前,我想检查新架构是否有任何文档无效。有没有一种自动化的方法来做到这一点?

还是命令行实用程序?

您如何发布具有更改架构的新版本?

谢谢!

麦克风

4

3 回答 3

2

从客户端或服务器上的流星应用程序(假设您可以访问要在客户端上检查的所有文档):

MyCollection.find().forEach(function(doc){
  check(doc,MyCollectionSchema);
});

您可能还想记录故障doc及其_id故障,以便您可以修复它们。

于 2016-01-07T01:56:22.850 回答
0

我遵循@michel 的建议,制作了这条服务器端路线来检查收藏品。

这是非常危险的,因为它正在清理和保存您的数据。这意味着它正在擦除字段。可能您不想要这些字段,这就是您将它们从架构中删除的原因,但也可能是一个错误。所以警告买主牛仔。显然,这不应该在生产服务器上。

可以使用这样的 url 检查它们:

http://127.0.0.1:4000/v/users

回复:

{
  "ok": 1
}

路线:

skipUpdatedAt = true;

Router.route('validate', {
  path: '/v/:collection',
  where: 'server',
  action: function() {

    var res = this.response;

    var collections = {
      users: Meteor.users,
      puppies: Puppies,
      unicorns: Unicorns,
      rainbows: Rainbows,
    };

    var c = collections[this.params.collection];
    if (!c) {
      res.statusCode = 404;
      return res.end('not found');
    }
    var s = c.simpleSchema();

    var ret = { ok: 0 };

    c.find().forEach(function(doc){
      var id = doc._id;
      try {
        s.clean(doc);
        check(doc,s);
        c.update(id, doc, {validate: false});
        ret.ok += 1;
      } catch (e) {
        ret[id] = {
          doc: doc,
          error: e.toString(),
        };
        console.log('=============ERROR');
        console.log(doc);
        console.log('-------------');
        console.log(e);
      }
    });

    res.statusCode = 200;
    if (Object.keys(ret).length) res.statusCode = 500;
    res.end(JSON.stringify(ret, null, 2));
  }
});
于 2016-01-07T03:25:00.410 回答
0

SimpleSchema 和 Collection2 都有验证方法。

对于 SimpleSchema,这里是他们的示例代码:https ://github.com/aldeed/meteor-simple-schema#validating-data

对于 Collection2,检查从验证上下文https://github.com/aldeed/meteor-collection2#validation-contexts开始的部分

于 2016-01-07T01:56:14.983 回答