1

新しいプロジェクトを作成します。

$ 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);
});

直接挿入とは異なり、このメソッドはキャッチされない例外をスローすることに注意してください。さらに、カスタム スローからエラーがスローされ、エラー コード 333 が表示されます。

なぜこれが適切に処理されないのですか?これを軽減してエラーを処理できるようにするにはどうすればよいですか (ユーザーに通知する、元のドキュメント ページにリダイレクトするなど)。

4

1 に答える 1

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 またはエラー オブジェクトとして結果を返すコールバック関数を使用して、クライアント側から呼び出されることを意図しています。

于 2014-02-19T16:58:33.227 に答える