5

पर अपडेट होने से मॉडल को रोकता है मैं एक वेब एप्लिकेशन पर काम कर रहा हूं जो पाइथन के चेरीपी फ्रेमवर्क के साथ लिखे गए एक आरामदायक एपीआई द्वारा संचालित है। मैंने jQuery इंटरफ़ेस को jQuery और सर्वर साइड टेम्पलेट्स के संयोजन के साथ लिखना शुरू कर दिया, लेकिन आखिरकार बैकबोन.जेएस पर स्विच किया क्योंकि jQuery हाथ से बाहर हो रहा था।बैकबोन.जेएस में HTTP बेसिक प्रमाणीकरण शीर्षलेख जोड़ना सिंक फ़ंक्शन सेव()

दुर्भाग्यवश, मुझे सर्वर के साथ समन्वयित करने के लिए मेरे मॉडल प्राप्त करने में कुछ समस्याएं आ रही हैं।

$(function() { 
    var User = Backbone.Model.extend({ 
     defaults: { 
      id: null, 
      username: null, 
      token: null, 
      token_expires: null, 
      created: null 
     }, 

     url: function() { 
      return '/api/users'; 
     }, 

     parse: function(response, options) { 
      console.log(response.id); 
      console.log(response.username); 
      console.log(response.token); 
      console.log(response.created); 
      return response; 
     } 
    }); 

    var u = new User(); 
    u.save({'username':'asdf', 'token':'asdf'}, { 
     wait: true, 
     success: function(model, response) { 
      console.log(model.get('id')); 
      console.log(model.get('username')); 
      console.log(model.get('token')); 
      console.log(model.get('created')); 
     } 
    }); 
}); 

आप शायद बता सकते हैं के रूप में, विचार यहाँ सेवा के साथ एक नया उपयोगकर्ता रजिस्टर करने के लिए है: यहाँ मेरी कोड से एक त्वरित उदाहरण है। जब मैं u.save(); पर कॉल करता हूं, तो बैकबोन वास्तव में सर्वर पर एक POST अनुरोध भेजता है। यहाँ प्रासंगिक बिट कर रहे हैं:

अनुरोध:

Request URL: http://localhost:8080/api/users 
Request Method: POST 
Request Body: {"username":"asdf","token":"asdf","id":null,"token_expires":null,"created":null} 

प्रतिक्रिया:

Status Code: HTTP/1.1 200 OK 
Content-Type: application/json 
Content-Length: 109 
Response Body: {"username": "asdf", "created": "2013-02-07T13:11:09.811507", "token": null, "id": 14, "token_expires": null} 

आप देख सकते हैं, सर्वर ने अनुरोध को संसाधित करता है और एक id और एक वापस भेजता है created के लिए मूल्य। लेकिन किसी कारण से, जब मेरा कोड console.log(u.id); पर कॉल करता है, तो मुझे null मिलता है, और जब मेरा कोड console.log(u.created); पर कॉल करता है, तो मुझे undefined मिलता है।

टीएल; डी: save() पर कॉल के बाद बैकबोन.जेएस मेरी ऑब्जेक्ट्स में क्यों नहीं बदल रहा है?

संपादित करें: मैं ऊपर कोड संशोधित करने के लिए इतना है कि मॉडल गुण एक success कॉलबैक में प्राप्त फंक्शन का उपयोग करके पहुंचा जाता है। यह मूल कोड के साथ किसी भी समवर्ती समस्याओं को हल करना चाहिए।

मैंने मॉडल के parse फ़ंक्शन में कुछ कंसोल लॉगिंग भी जोड़ा है। विचित्र रूप से पर्याप्त, इनमें से प्रत्येक undefined है ... क्या इसका मतलब यह है कि Backbone.js मेरी प्रतिक्रिया JSON को पार्स करने में विफल रहा है?

संपादित करें 2: कुछ दिन पहले, मुझे पता चला कि इस मुद्दे को वास्तव में लगता है कि मैं बुनियादी HTTP प्रमाणीकरण सक्षम करने के लिए प्रत्येक अनुरोध को जोड़ने था एक कस्टम हेडर था। विवरण के लिए this answer देखें।

+0

आपका कोड ठीक लग रहा है (सिवाय इसके कि आप '' Model.urlRoot' Model.url' के बजाय का उपयोग करना चाहिए, लेकिन यह समस्या यहाँ नहीं है)। आपके कोड के पहले संशोधन में समस्याएं थीं, लेकिन क्या आप पूरी तरह से सुनिश्चित हैं कि आपके वर्तमान संपादन में सटीक कोड अभी भी विफल रहता है? – jevakallio

उत्तर

3

के लिए मैंने इस मुद्दे को समझ लिया, हालांकि मुझे अभी भी की व्याख्या करने के लिए नुकसान हुआ है क्यों यह एक मुद्दा है। जिस वेब ऐप का निर्माण मैं कर रहा हूं वह एक प्रमाणीकरण प्रक्रिया है जिसके लिए सभी अनुरोधों के साथ एक HTTP मूल प्रमाणीकरण शीर्षलेख होना आवश्यक है।

बैकबोन के साथ यह काम करने के लिए, मैंने बैकबोन.sync फ़ंक्शन को ओवरराइड किया और हेडर जोड़ने के लिए line 1398 बदल दिया।

मूल कोड:

var params = {type: type, dataType: 'json'}; 

संशोधित कोड:

var params = { 
    type: type, 
    dataType: 'json', 
    headers: { 
     'Authorization': getAuthHash() 
    } 
}; 

समारोह getAuthHash() सिर्फ एक Base64 स्ट्रिंग है जो उचित प्रमाणीकरण जानकारी का प्रतिनिधित्व करता है देता है।

किसी कारण से, इस हेडर के अतिरिक्त सिंक/सेव फ़ंक्शन विफल हो जाता है। अगर मैं इसे बाहर ले जाता हूं, तो सब कुछ काम करता है जैसा आप उम्मीद कर सकते हैं।

बक्षीस अभी भी खुला है, और मैं खुशी से किसी को भी इनाम दूंगा जो यह समझा सकता है कि यह क्यों है, साथ ही समस्या का समाधान भी प्रदान करता है।

संपादित करें:

ऐसा लगता है कि समस्या की तरह जिस तरह से है कि मैं अनुरोध के हेडर को जोड़े रहा था। एक अच्छी छोटी जावास्क्रिप्ट लाइब्रेरी available on Github है जो HTTP बेसिक एथ हेडर को सही ढंग से जोड़कर इस समस्या को हल करती है।

3

इस कोड:

u.save(); 
console.log(u.id); 
console.log(u.username); 
console.log(u.token); 
console.log(u.created); 

रन तुरंत ... चलाने के लिए कुछ भी नहीं है के बाद कि वहाँ और पंक्तिबद्ध ajax अनुरोध शुरू होता है। प्रतिक्रिया तब थोड़ी देर बाद आती है और केवल उस बिंदु पर मूल्य बदल जाते हैं।

यह भी लगता है कि उन गुणों सीधे वस्तु पर नहीं हैं, लेकिन बचाने के अतुल्यकालिक प्रसंस्करण अभी भी रखती है तुम भी उम्मीद नहीं होता है कि मिल परिणाम अगर आपको लगता है कि कोड को सही console.log(u.get("id")) आदि

+0

u.id के बजाय u.get ("id") का उपयोग करने का आपका सुझाव बहुत समझ में आता है, लेकिन अगर मैं सफलता कॉलबैक में या मॉडल के सिंक ईवेंट में उन गुणों को लॉग करने का प्रयास करता हूं, तो भी वे अनसेट रहते हैं, इसलिए मैं सोचो कि समस्या के लिए और भी कुछ है। – MusikPolice

+0

मैंने आपके सुझावों को शामिल करने के लिए मूल प्रश्न में कोड संपादित किया है ... यह अभी भी काम नहीं कर रहा है, और मैं अपने wits अंत में हूँ। – MusikPolice

+0

@MusikPolice यदि आपने एक पार्स फ़ंक्शन परिभाषित किया है तो प्रतिक्रिया से पारदर्शी मॉडल को वापस करने की आपकी ज़िम्मेदारी है। इस फ़ंक्शन का उपयोग तब किया जाता है जब सर्वर से प्रतिक्रिया – Esailija

2

मैं मेरे लिए अपने कोड, अपने काम करता है ठीक परीक्षण किया है।

यहाँ डेमो देखें, jsfiddle.net/yxkUD/

+1

हाँ, यह काम कर रहा है .. –

+0

क्षमा करें, मैंने इस समस्या के बारे में अतिरिक्त जानकारी नहीं जोड़ा है। अधिक जानकारी के लिए [यह विवरण] देखें (http://stackoverflow.com/a/15003301/591374) – MusikPolice

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