Meteor collection.insert回调返回新的id

时间:2013-09-13 11:26:53

标签: javascript meteor

我想在meteor.collection.insert的回调中获取新插入的docuement的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,但是我得到一个引用错误,说错误和结果没有定义。我在这里弄错了什么?任何帮助都非常值得赞赏。

3 个答案:

答案 0 :(得分:4)

你大多都有正确的想法,但你会混淆几件事。目前,您的Meteor方法没有返回任何内容,因为您通过提供回调异步调用插入。可以完成异步方法返回,但它比你需要的东西复杂得多(请查看此excellent async guide以获取更多信息)。

您可以使用不带回调的insert方法而不是回调,并将其分配给变量,如var incidentId = Incidents.insert({ ... }); - 返回。

然后,在Meteor.call的客户端回调中,结果应该是_id。

答案 1 :(得分:0)

从客户端,如果从Meteor.methods返回,您的回调函数结果将返回最后插入的对象ID。

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

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

urlId具有最后插入对象的id。

答案 2 :(得分:-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'