Collection2,使用方法插入,未捕获的唯一约束的异常

时间:2014-01-29 15:51:44

标签: meteor meteor-collection2

我创建了一个新项目:

$ mrt create sandbox
$ mrt remove autopublish
$ mrt add collection2

使用以下代码创建一个对键具有唯一约束的简单集合

SandBoxCollection = new Meteor.Collection('sandboxcoll', {
  schema: new SimpleSchema({
    title: {
      type: String,
      min: 3,
      unique: true,
      index: true
    }
  })
});

if (Meteor.isServer) {
  Meteor.publish('sandboxpub', function() {
    return SandBoxCollection.find();
  });
}

if (Meteor.isClient) {
  Meteor.subscribe('sandboxpub');
}

Meteor.methods({
  create: function(doc) {
    var docId = SandBoxCollection.insert(doc, {validationContext: 'create'}, function(err, res) {
      if (err) {
        throw new Meteor.Error(333, SandBoxCollection.simpleSchema().namedContext('create').invalidKeys());
      }
      return res;
    });
    return docId;
  }
});

我设置了一个简单的集合,pub / sub和一个可以用于插入的方法。

然后我使用浏览器控制台发出以下命令

让我们先创建一个文档:

Meteor.call('create', {title: 'abcd01'}, function(e,r){
  console.log(e ? e : r);
});

现在让我们尝试使用collection.insert()直接插入副本:

SandBoxCollection.insert({title: 'abcd01'}, function(e,r) {
  console.log('error: ');
  console.log(e);
  console.log('errorkeys: ');
  console.log(SandBoxCollection.simpleSchema().namedContext().invalidKeys()); 
  console.log('result: ');
  console.log(r);  
});

我们可以看到回调处理的333错误并记录到控制台。

现在尝试使用以下方法插入副本:

Meteor.call('create', {title: 'abcd01'}, function(e,r){
  console.log(e ? e : r);
});

请注意,与直接插入不同,该方法会抛出未捕获的异常!此外,从我们的自定义throw抛出错误,它有错误代码333。

为什么处理不当?我该怎么做才能缓解这个问题,以便我可以对错误做些什么(通知用户,重定向到原始文档页面等)

1 个答案:

答案 0 :(得分:0)

截至2014年2月,这是针对https://github.com/aldeed/meteor-collection2/issues/59

上的collection2问题跟踪器的增强请求

当前的解决方法(在服务器上)是单独捕获错误并将其提供给自定义Meteor.Error,如:

if (Meteor.isServer) {
  Meteor.methods({
    insertDocument: function(collection, document) {
      check(collection, String);
      check(document, Object);

      var documentId = '',
          invalidKeys = [];

      function doInsert() {
        documentId = SandboxProject.Collections[collection + 'Collection'].insert(document, {validationContext: collection + 'Context'});
      }

      try {
        doInsert();
      } catch (error) {
        invalidKeys = SandboxProject.Collections[collection + 'Collection'].simpleSchema().namedContext(collection + 'Context').invalidKeys();
        error.invalidKeys = invalidKeys;
        throw new Meteor.Error(333, error);
      }
      return documentId;
    }
  });
}

注意:这是一种通用插入方法,它将命名空间集合名称作为参数和文档。它旨在从客户端调用一个回调函数,该函数返回结果作为文档id或错误对象。