2014-12-07 31 views
0

我無法獲得插入的_id的返回值,使用我在這裏找到的相同問題的答案;在Meteor.method調用插入後無法檢索_id

Meteor.call('saveDocument', value1, value2, function(error, result){ 
var theIdYouWant = result; 
}); 

和在服務器上;

saveDocument: function (value1, value2) { 
    return MyCollection.insert({ 'value1': value1, 'valu2': value2}); 
} 

答案是從2013年5月,所以我不知道這是不孤獨的人以正確的方式錯誤,結果總是不確定的。不過,我可以通過將其保存在服務器上來實現它的功能;

'transactionInsert': function(currentUserId, trx_num, other_stuff){ 
     trxId = trx.insert ({ 
      "userID": currentUserId, 
      "trx_num": trx_num, 
      ... other stuff ... 
     }); 
    }, 
    'insertInvoiceItem': function(currentUserId, invoiceNum){ 
     invoiceItems.insert(
      {"userID": currentUserId, 
      "invoice_num": invoiceNum, 
      "trx_id": trxId}    
     ); 
    } 

從客戶insertInvoiceItemtransactionInsert後立即調用。我的問題是trxId始終是交易的正確標識,即使數以千計的用戶正在使用此或可以另一個用戶交易導致id不正確?

更新:

我錯了,仍然沒有工作。這是我現在的地方;

Meteor.call('transactionInsert', Meteor.userId(), trx_num, 
    function(error, result){ 
     console.log(Session.get("trxId")); // p2YrLTiypiMm4tKma appears AFTER undefined in the console 
     Session.set("trxId",result); 
    }); 
console.log("trxId is " + Session.get("trxId")); // undefined 
Meteor.call('insertInvoiceItem', Meteor.userId(), invoiceNum, Session.get("trxId") 

Template.writeInvoice.helpers({ 
    trxId: function() { 
     return Session.get("trxId"); 
    } 
}) 

在服務器上;

Meteor.methods({ 
    'transactionInsert': function(currentUserId, trx_num){ 
     return trx.insert ({ 
      "userID": currentUserId, 
      "trx_num": trx_num 
     }) 
    }, 
    'insertInvoiceItem': function(currentUserId, invoiceNum, trxId){ 
     invoiceItems.insert(
      {"userID": currentUserId, 
      "invoice_num": invoiceNum, 
      "trx_id": trxId} 
     ) 
    } 
}) 
+0

您的原始代碼看起來還好我。如果你在回調中的** console.log(result)** **會發生什麼?我懷疑你遇到的問題是'theIdYouWant'沒有被定義**在回調的外部**。這是預料之中的,因爲它是一個異步功能。看[this](https://www.discovermeteor.com/patterns/5828387)的例子。 – 2014-12-07 15:23:57

+0

奇怪。該值顯示在控制檯中,而變量保持未定義狀態。所以如果我在模板中使用'theYdYouWant',那麼它應該工作?將它定義爲服務器上的全局變量有什麼不妥,就像我現在正在做的那樣? – 2014-12-07 15:41:19

回答

1

正如David Weldon所言,這可能只是一個範圍問題。您的回調之外不存在您的變量。嘗試定義它像這樣:

var id; 

Meteor.call('saveDocument', value1, value2, function(error, result){ 
id = result; 
}); 

//Do stuff with the id... 

或者,如果你需要它的反應計算內(如模板):

var id = new ReactiveVar(); //meteor add reactive-var 

Meteor.call('saveDocument', value1, value2, function(error, result){ 
id.set(result); 
}); 

//Use id.get() where you need it 
+0

試過兩種方法,它仍然回來undefined。我可以在控制檯中找到它,但它仍然不是異步的。 – 2014-12-07 20:44:39

+0

更新後,我真的不知道你的代碼中發生了什麼。你說你的'console.log(Session.get(「trxId」));'顯示控制檯中的某些東西,但是從我看到的第一個'Session.set()'發生在...之後......你能給我們一個MeteorPad或更精確的控制檯日誌? 編輯:哦,等我明白了。好的。我明白你的意思了,但是我看不出你的代碼有什麼問題......如果你還沒有找到任何解決方案,請嘗試爲我們做一個MeteorPad來查看代碼。 – 2014-12-07 22:35:25

+0

我在這裏放了足夠的代碼來複制問題 - http://meteorpad.com/pad/RCTD7gvhDwscZebrS/Leaderboard – 2014-12-08 14:13:56

相關問題