2014-09-12 6 views
5

के अंदर एक Meteor.call विधि से एक त्रुटि कैसे वापस कर सकता हूं मेरा उल्का कोड कुछ बिंदुओं पर गहराई से Meteor.call विधियों को चलाता है। अगर मुझे दूसरी परत में कोई त्रुटि है और मैं उस उल्का त्रुटि को क्लाइंट पक्ष में वापस फेंकना चाहता हूं तो मैं यह कैसे कर सकता हूं?मैं किसी अन्य Meteor.call

वर्तमान में मैं कुछ इस तरह है, लेकिन मैं बहुत भ्रमित आउटपुट हो रही है और मुझे नहीं लगता कि मैं पूरी तरह से समझते क्या हो रहा है जब मैं throw new Meteor.Error(500, e.category_code, e.description);

फोन कर रहा हूँ client.js में

Meteor.call('firstCall', data, function (error, result) { 
    if(result) { 
    doSomething(); 
    } 
    else{ 
    console.log(error);//just shows 500 
    } 
}); 

server.js में

var Future = Meteor.npmRequire("fibers/future"); 

function extractFromPromise(promise) { 
    var fut = new Future(); 
    promise.then(function (result) { 
     fut.return(result); 
    }, function (error) { 
     console.log(error); 
     fut.throw(error); 
    }); 
    return fut.wait(); 
} 

firstCall: function (data){ 
    try{ 
    Meteor.call('secondCall', data, 'http://testhref.com/test', 'http://testhref2.com/test' function (error, result) { 
     return result; 
    }); 
    } 
    catch(e){ 
    throw new Meteor.Error(500, e.category_code, e.description); 
    } 
} 

secondCall: function (data, paymentHref, otherHref){ 
    try{ 
    var associate = extractFromPromise(balanced.get(paymentHref).associate_to_customer(otherHref).debit({ 
       "amount": data.paymentInformation[0].total_amount * 100, 
       "appears_on_statement_as": "Trash Mountain"})); 
    } 
    catch(e){ 
    Collection.update(data.id, { 
     $set: { 
      'failed.category_code': e.category_code, 
      'failed.description': e.description 
     } 
    }); 
    throw new Meteor.Error(500, e.category_code, e.description); 
    } 
} 

उत्तर

2

आपके मामले में, firstCall में पकड़ e.category_code और e.description जब secondCall फेंकता के लिए परिभाषित के लिए कुछ भी करने के लिए नहीं जा रहा है। इसका कारण यह है secondCall में आप Meteor.Error तर्क है, जो अपने तर्कों error, reason के रूप में लेता है के रूप में इन दो, और details गुजर रहे हैं: आदेश के माध्यम से इन में उत्तीर्ण होने के

https://github.com/meteor/meteor/blob/devel/packages/meteor/errors.js

, आप की आवश्यकता होगी firstCall संशोधन करने के लिए इन गुणों का उपयोग करें:

firstCall: function (data){ 
    try{ 
    Meteor.call('secondCall', data, 'http://testhref.com/test', 'http://testhref2.com/test'); 
    } 
    catch(e){ 
    throw new Meteor.Error(500, e.reason, e.details); 
    } 
} 

मैं भी यकीन है कि आप इसे विभाजित अप करने की आवश्यकता नहीं कर रहा हूँ मॉड्यूलरिटी के लिए दो कॉल में, क्योंकि आप सामान्य जावास्क्रिप्ट कार्यों का उपयोग कर सकते हैं। लेकिन हम उस जगह कहीं और चर्चा कर सकते हैं।

+0

यहां तक ​​कि यह त्रुटि से सही जानकारी वापस नहीं प्रतीत होता है। ऊपर मेरा उदाहरण समस्या की व्याख्या करने के लिए पर्याप्त नहीं है।मेरे पास अपना पूरा पहला प्रयास है, जिसे पकड़ने की कोशिश में लपेटा गया है, लेकिन जब त्रुटि फेंक दी जाती है तो कोड निष्पादित करना प्रतीत होता है, जो एक और त्रुटि का कारण बनता है और यही वह है जिसे पहले क्लाइंट से वापस किया जा रहा है। – JoshJoe

+0

क्या आप सिंक्रनाइज़ रूप से 'secondCall' को कॉल कर रहे हैं? मेरा संशोधन देखें। –

+0

मैं इसे तुल्यकालिक रूप से नहीं बुला रहा था। यह तय है, लेकिन मुझे लगता है कि ग्राहक को त्रुटि प्राप्त करने के लिए निश्चित रूप से एक बेहतर तरीका होना चाहिए। मुझे यकीन है कि मैं यह सबसे अच्छा तरीका नहीं कर रहा हूं। धन्यवाद – JoshJoe

0

मैं कुछ चीजें यहाँ उल्लेख करना:

  1. Async फ़ंक्शन अपवाद नहीं फेंकता है (सिवाय इसके कि आप उन्हें Meteor._wrapAsync का उपयोग करके सिंक की तरह बनाते हैं जैसा कि मैं बाद में समझाऊंगा), वे त्रुटि को दूसरी तरफ लौटते हैं (जैसा कि नोडजेएस कॉलबैक में पहला तर्क है -अंदाज)। यह Meteor.call और आपके doSomeAsyncThing दोनों पर लागू होता है।
  2. मैं सर्वर पर Meteor.call का उपयोग करने का लाभ नहीं देख सकता। Meteor.call क्लाइंट से सर्वर विधियों को कॉल करने के लिए है। इस मामले में आप firstCall के अंदर से YourObj.secondCall पर कॉल कर सकते हैं।
  3. कॉलबैक के अंदर से कुछ लौटा रहा है (जैसा कि आप firstCall के अंदर कर रहे हैं) का कोई प्रभाव नहीं पड़ता है। आप अपने एसिंक कोड को सिंक कोड के रूप में काम करना चाहते हैं, इसलिए मैं Meteor._wrapAsync का उपयोग करने का सुझाव देता हूं जो बहुत अच्छी तरह से समझाया गया है here
firstCall: function (data){ 
    try{ 
    return this.secondCall(data); 
    } 
    catch(e){ 
    throw new Meteor.Error(500, e.category_code, e.description); 
    } 

secondCall: function (data){ 
    try{ 
    return Meteor._wrapAsync(doSomeAsyncThing)(data); 
    } 
    catch(e){ 
    Collection.update(data.id, { 
     $set: { 
      'failed.category_code': e.category_code, 
      'failed.description': e.description 
     } 
    }); 
    throw new Meteor.Error(500, e.category_code, e.description); 
    } 

आशा इस मदद करता है: तो, मैं सर्वर साइड पर कुछ भिन्न लागू होता!

+0

ठीक है, मैंने उपयोग किए गए वादे एसिंक फ़ंक्शन को दिखाने के लिए प्रश्न अपडेट किया है। मैं _wrapAsync का उपयोग नहीं कर सकता क्योंकि यह वादे के साथ काम नहीं करता है। साथ ही, मैंने देखा कि मुझे कुछ याद आया} इसलिए मैंने उन जगहों को रखा जहां वे हैं। मेरे पास दूसरी विधि में मेरी विधि कॉल है और इसलिए मैं एक और Meteor.call कर रहा था। मुझे लगता है कि मैं इसके बजाय एक फ़ंक्शन का उपयोग कर सकता हूं, लेकिन मैं अपनी विधियों को बहु-प्रयोग करने की कोशिश कर रहा हूं और मैं उन्हें कई अलग-अलग फ़ाइलों से कॉल करने में सक्षम होना चाहता हूं। – JoshJoe

संबंधित मुद्दे