2013-06-06 11 views
8

हैलो बैकबोन निंजा,बैकबोन समन्वयन त्रुटि प्रतिक्रिया कोड के बाद भी 200

यह मेरा पहली बार रीढ़ का उपयोग कर - तो मेरे "noob" सत्ता क्षमा करें। मेरी कार्यक्षमता (एक बड़े ऐप का हिस्सा) में, मेरे पास एक बैकबोन व्यू वीए है, जिसे मॉडल एमए (जैसा होना चाहिए) द्वारा समर्थित है और सर्वर की तरफ स्प्रिंग एमवीसी में @RequestBody और @ResponseBody के साथ स्प्रिंग नियंत्रक विधियों को एनोटेट किया गया है। मुझे जैक्सन स्प्रिंग के साथ ठीक काम कर रहा है।

अब, अनुप्रयोग में,

Backbone.Model 
|_ BaseModel (custom base model for our app) 
    |_ mA (my model) 

एमए अपनी ही endpoint है और यह रीढ़ सफलतापूर्वक कॉल है कि जब एक PUT अनुरोध यानी बनाने, जब मैं() को बचाने फोन देखें VA से एक सबमिट बटन ईवेंट हैंडलर से जैसे इतना:

this.model.save ({

  success : function(){ 

        alert('Request submitted successfully'); 


      }, 

      error : function(){ 
       alert('Something awful happened.'); 
      } 

});

define([], function() { 



window.BaseModel = Backbone.Model.extend({ 
...... 


}); 

onSyncError : function(model, response) { 
     switch (response.status) { 
     case 403: 
     [...//some more code ] 
     default: 
      alert(bundle.getDefault('HTTP_RESP_OTH') + response.status); 
     } 
    }, 

    onSyncSuccess : function(model, response) { 
     alert('Sync done! '); 
    }, 

    sync : function(method, model, options) { 
     options.error = this.onSyncError; 
     Backbone.sync.call(this, method, model, options); 
     ....//some more stuff.  
    }, 

} 

स्प्रिंग नियंत्रक विधि:

हमारे BaseModel निम्नलिखित है

@RequestMapping(value="/resource/xyz/{id}.json", method = RequestMethod.PUT, consumes  = {"application/json"} 
, produces = {"application/json"}) 
@ResponseBody 
public Map<String,String> methodX(@RequestBody XyzDTO xyzDTO){ 
.... 
map.put("msg", "success"); 

return map; 
} 

इसके अलावा, इससे पहले कि मैं सही कर बचाने कहते हैं, मैं कुछ मॉडल गुण, सर्वर साइड डीटीओ के बाद से संशोधित इस तरह की एक अलग संरचना है:

this.model.unset("abc",{ silent: true }); 
this.model.set({ abc: {id : "2",xyz:{ ... //more code }); 

समस्या यह है कि, कॉलिंग() को पुट उत्पन्न करता है अनुरोध करें और स्प्रिंग एंडपॉइंट हैंडलर को सफलतापूर्वक कॉल करें, लेकिन मुझे एक प्रतिक्रिया कोड 200 मिलता है (जो मुझे उम्मीद है), लेकिन जब मैं फायरबग के साथ कॉल का पता लगाता हूं, तो यह ऑनसिंक त्रुटि विधि में जाता है और मुझे एक त्रुटि संदेश देता है (क्योंकि इसमें "डिफ़ॉल्ट" मामला)।

बैकबोन दस्तावेज़ कहता है: "जब JSON प्रतिक्रिया लौटाते हैं, तो सर्वर द्वारा परिवर्तित किए गए मॉडल के गुणों को भेजें, और क्लाइंट पर अद्यतन होने की आवश्यकता है"। खैर, मुझे क्लाइंट साइड पर मॉडल को अपडेट करने की आवश्यकता नहीं है, इसकी आखिरी स्क्रीन में से एक है और मुझे बस सफलता/त्रुटि के उपयोगकर्ता को बताने की जरूरत है और उसे मुख्य पृष्ठ/डैशबोर्ड पर रीडायरेक्ट करना है।

मैंने कुछ और पढ़ा है, और यह कोड 200 लगता है क्योंकि प्रतिक्रिया पर्याप्त नहीं है - सिंक विफल होने के कारण जेएसओएन पार्सिंग त्रुटियां हो सकती हैं।

मैंने फायरबग में प्रतिक्रिया की जांच की, और प्रतिक्रिया JSON {"msg": "सफलता"} की तरह दिखती है।

तो, क्या गलत हो सकता है?

+1

मुझे यकीन है कि नहीं कर रहा हूँ अगर यह आपकी समस्या का कारण होता है, लेकिन मैं इस तथ्य है कि 'बैकबोन के साथ पहले मुसीबत पड़ा है .Model.save() 'वास्तव में आपको अपने बचत डेटा को पहले तर्क के रूप में रखने की आवश्यकता है, जैसे: 'model.save (model.toJSON(), {success सफलता: function() {}, त्रुटि: फ़ंक्शन() {}); मैंने अतीत में इसके साथ मुद्दों में भाग लिया है जहां मुझे अजीब त्रुटियां मिलीं क्योंकि मैं भूल गया था कि आपको उस डेटा में स्पष्ट रूप से पास करना होगा जिसे आप सहेजना/पोस्ट करना चाहते हैं। यह कोशिश करो। – brettjonesdev

+0

आपके समय के लिए धन्यवाद। लेकिन यह मदद नहीं की। अब, जब मैं प्रतिक्रिया देता हूं तो फायरबग में यह मिलता है: TypeError: एक अपरिभाषित ... फ़ंक्शन द्वि (ए, बी, डी) {var e = b.dir, f = d && b.dir === "parentNode", g = u ++; ... – trishulpani

उत्तर

1

आपके समय के लिए धन्यवाद।मैं अंततः PUT अनुरोध करने के लिए $ .ajax का उपयोग कर समस्या को हल करने में सक्षम था, जिससे पूरे बैकबोन सिंक चीज़ को बाईपास कर दिया गया। AJAX कॉलबैक में मेरी सफलता हैंडलर प्रतिक्रिया को संभालती है और कोई और सिंक त्रुटियां नहीं होती हैं (क्योंकि इसे किसी भी तरह से नहीं कहा जा रहा है) :)

+0

कोई समस्या नहीं होगी। मुझे यकीन नहीं है कि $ .ajax को सीधे कॉल करके इस मुद्दे को स्कर्ट करना सबसे अच्छा समाधान है, लेकिन जो भी आपके लिए काम करता है। आप [यह थ्रेड] भी देख सकते हैं (http://stackoverflow.com/questions/6394108/how-should-server-respond-to-backbone-sync?rq=1) जो इस सवाल का जवाब देता है कि सर्वर को किस प्रकार जवाब देना चाहिए 'model.save()'। – brettjonesdev

9

Backbone.Model.save() सर्वर से प्रतिक्रिया मॉडल के मूल्यों के एक अद्यतन हैश होने की अपेक्षा करता है। अगर आपकी प्रतिक्रिया {"msg":"Success"} की तरह है, तो बैकबोन आपके मॉडल के साथ सिंक हो सकता है। असल में, यह आपके HTTP 200 JSON प्रतिक्रिया को मॉडल के गुणों के रूप में व्याख्या करता है और तदनुसार मॉडल को सिंक करने का प्रयास करता है।

आप या तो 1) अपने स्प्रिंग नियंत्रक पथ एक JSON-ified मॉडल प्रतिक्रिया वापस बनाना, 2) एक सादे 200 एक खाली प्रतिक्रिया शरीर के साथ वापसी या 3) एक कस्टम parse तरीका है जिसके {"msg":"Success"} प्रारूप के साथ प्रतिक्रिया के लिए लग रहा है लिखने की कोशिश कर सकते और अलग-अलग प्रतिक्रिया देता है।

+3

एक खाली प्रतिक्रिया निकाय अभी भी त्रुटि हैंडलर को कॉल करेगा, '{}' की प्रतिक्रिया हालांकि – robertjlooby

0

मैं एक ही समस्या के साथ अपना अनुभव साझा करूंगा; कस्टम बेस-मॉडल और कॉलिंग model.save और कोई सफलता ईवेंट निकाल दिया गया।

मेरी समस्या बेस मॉडल में एक कस्टम सेट फ़ंक्शन के साथ थी जिसने "यह" वापस नहीं किया था।

आप के लिए रीढ़ की हड्डी स्रोत कोड को झांक सकते हैं मॉडल: सहेजना आप इस टुकड़ा मिल जाएगा:

options.success = function(resp) { 
    // Ensure attributes are restored during synchronous saves. 
    model.attributes = attributes; 
    var serverAttrs = model.parse(resp, options); 
    if (options.wait) serverAttrs = _.extend(attrs || {}, serverAttrs); 
    if (_.isObject(serverAttrs) && !model.set(serverAttrs, options)) { 
     return false; 
    } 
    if (success) success(model, resp, options); 

    model.trigger('sync', model, resp, options); 
    }; 

model.set (serverAttrs, विकल्प) मेरे मामले में विफल रहा है और बचाने-समारोह लौटे किसी भी घटना को ट्रिगर करने से पहले झूठा।

हो सकता है कि यह आपकी समस्या नहीं था, लेकिन उम्मीद है कि यह किसी और वहाँ बाहर किसी की मदद करेंगे ...

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