1

meteor.collection.insert のコールバックで、新しく挿入されたドキュメントの ID を取得したいと考えています。

次のようにドキュメントを挿入します。

Meteor.call('createDoc', {
    key1: value1,
    key2: value2
})

createDoc 関数は次のようになります。

Meteor.methods createDoc: (options) ->
    incidents.insert
        key1: options.value1
        key2: options.value2
        , callback(error, result)

callback = (error,result) ->
    console.log result

ドキュメントには次のように記載されています。

callback Function
Optional. If present, called with an error object as the first argument and,
if no error,the _id as the second.

そのため、結果が新しい ID を返すことを期待していますが、エラーと結果が定義されていないという参照エラーが発生しています。ここで何が間違っていますか?どんな助けでも大歓迎です。

4

3 に答える 3

4

あなたはほとんど正しい考えを持っていますが、いくつかのことを混乱させています。現在、Meteor メソッドは何も返していません。これは、コールバックを提供して挿入を非同期的に呼び出しているためです。非同期メソッドのリターンは実行できますが、これほど単純なものを必要とするよりもはるかに複雑です (詳細については、この優れた非同期ガイドをチェックしてください)。

コールバックを使用する代わりに、コールバックなしで挿入メソッドを使用して、それを変数に割り当てることができますvar incidentId = Incidents.insert({ ... });

次に、 のクライアント側コールバックでMeteor.call、結果は _id になります。

于 2013-09-13T11:55:19.637 に答える
0

クライアント側から、Meteor.methods から戻る場合、コールバック関数の結果は最後に挿入されたオブジェクト ID を返します。

Meteor.call('addURL', url, function (error, result) {
    urlId = result;
});

Meteor.methods({
    addURL : function(url) {
        return URL.insert(url);
    }
});

urlId には、最後に挿入されたオブジェクトの ID があります。

于 2014-12-27T21:43:19.013 に答える
-1

BenjaminRH は、これを行うためのより簡単で可能性の高い方法について正しいです。ただし、サーバーが作業を行う必要がある場合や、流星でもデータベース作業を行う唯一の方法であると主張する人もいます。コードでそれを行う方法は次のとおりです。

# server code
Meteor.methods createDoc: (options) ->
  created = incidents.insert
    key1: options.value1
    key2: options.value2
  created

# on client code

Meteor.call 'createDoc', info, (err, data) ->
  if err
    console.log JSON.stringify err,null,2
    # DO SOMETHING BETTER!!
  else
    Session.set('added doc', data )  
    # and something reactive in waiting for session to have 'added doc'
于 2013-09-13T18:21:00.253 に答える