2012-06-09 13 views
7

के साथ उपयोग करने के लिए केवल अजाक्स के लिए एक्सप्रेस जेएस में आरईएसटी रूट सेट करें, मैं एक्सप्रेस के साथ नोड.जेएस का उपयोग कर मौजूदा वेबसाइट को दोबारा लिखने पर काम कर रहा हूं।बैकबोन

साइट का फ्रंट एंड बैकबोन जेएस का उपयोग करेगा और इस प्रकार मुझे सभी आवश्यक मार्ग मूल बैकबोन सिंक का अनुपालन करने की आवश्यकता है। अब यूआरएल के अधिकांश ग्राहक और बैकबोन सिंक के लिए समान होंगे। लेकिन वे नियमित रूप से जीईटी के लिए काम नहीं करेंगे क्योंकि उन्हें जेएसओएन वापस करने की आवश्यकता होगी।

तो मैं सोच रहा हूँ, यह/संग्रह ऐसे .json के रूप में रीढ़ में यूआरएल, मॉडल एक्सटेंशन जोड़ने के लिए एक अच्छा विचार हो सकता है, और एक्सप्रेस में हर मार्ग के लिए इस के लिए:

app.get('/p/:topCategory/:category/:product.:format', function(req, res) { ... }); 

कहाँ if (req.params.id == 'json') से हम JSON भेजते हैं, अन्यथा हम HTML प्रस्तुत करते हैं?

या क्या कोई बेहतर तरीका है? कृपया मदद करे।

उत्तर

12

ऐसा करने अर्थात् res.format एक्सप्रेस 3.x में सामग्री बातचीत सुविधा का उपयोग करने, होगा बेहतर तरीका:

https://github.com/visionmedia/express/blob/master/lib/response.js#L299-378

res.format({ 
    text: function(){ 
    res.send('hey'); 
    }, 

    html: function(){ 
    res.send('<p>hey</p>'); 
    }, 

    json: function(){ 
    res.send({ message: 'hey' }); 
    } 
}); 

आप दृष्टिकोण भी ठीक है, यामर पूर्व के लिए है। एक ही दृष्टिकोण का उपयोग कर रहा है: http://developer.yammer.com/api/#message-viewing

+0

उत्तर के लिए धन्यवाद। मुझे एक्सप्रेस डॉक्स में res.format() नहीं मिला। लेकिन मुझे req.is ('html') या req.is ('json') मिला। मुझे लगता है कि किसी को भी काम करना चाहिए लेकिन res.format() बेहतर काम करता है क्योंकि यह कार्य करता है और अगर res.is() के लिए मुझे/else उपयोग करने की आवश्यकता नहीं है। –

+0

यह अभी तक प्रलेखन में नहीं है क्योंकि एक्सप्रेस 3.x नया है और साइट को अपडेट करने की आवश्यकता है (जो जल्द ही मुझे पता चल जाएगा)। – alessioalex

+0

voilà: http://expressjs.com/api.html#res.format – UpTheCreek

6

अपने अनुरोधों में Accept हेडर का उपयोग करें: Accept: application/json यदि आप JSON, Accept: text/HTML प्राप्त करना चाहते हैं तो आप HTML चाहते हैं।

+0

और मैं इसे नोड पक्ष पर कैसे सेट करूं? –

+0

'स्वीकार करें:' से शुरू होने वाली किसी भी चीज़ के लिए 'req.headers' को देखने के लिए आप मानक जावास्क्रिप्ट टेक्स्ट-पार्सिंग तकनीकों (नियमित अभिव्यक्तियों, आदि) का उपयोग करते हैं। जिस तरह से मैं ऐसा करता हूं, वह एक JSON प्रतिक्रिया भेजना होगा यदि उनमें से कोई भी JSON के लिए पूछ रहा है, और उनमें से कोई भी HTML प्रतिक्रिया नहीं है। – ebohlman

2

एक विकल्प जो यह भी जांचता है कि "एक्स-अनुरोधित-साथ" शीर्षलेख jQuery et al के लिए सेट है।

var onlyAllowJsonRequests = function (req, res, next) { 

    var acceptJson = (req.accepted.length && _.any(req.accepted, function (acc) { return acc.value.indexOf("json") !== -1 })); 

    // also check that "X-Requested-With": "XMLHttpRequest" header is set 
    if (acceptJson && (req.xhr === true)) { 
     next(); 
    } else { 
     res.send(406, "Not Acceptable"); 
    } 
}; 

app.use(onlyAllowJsonRequests); 

एनबी अंडरस्कोर एक निर्भरता है।

2

मुझे लगता है कि ऐसा करने का सही तरीका सामग्री बातचीत को आपके आवेदन में लागू करना है। हाँ, एक्सप्रेस 3.x सुविधा ऐसा करने का एक तरीका है और आपके प्रश्न का सीधा जवाब प्रदान करता है, लेकिन मुझे नहीं लगता कि यह करने का सबसे अच्छा तरीका है क्योंकि यह रूटिंग तर्क में सामग्री वार्ता जिम्मेदारी रखता है। मुझे नहीं लगता कि यह इसके लिए एक अच्छी जगह है क्योंकि यह single responsibility सिद्धांत का पालन नहीं करता है, जिसमें सामग्री बातचीत रूटिंग तर्क में डाल दिया गया है।

मैंने सामग्री बातचीत को blog engine में लागू करने पर एक स्टैब लिया है; समीक्षा करना जो आपको एक अच्छी दिशा में मार्गदर्शन करने में मदद कर सकता है। सारांश यह है कि कोड फ़ाइल एक्सटेंशन को सामग्री बातचीत तर्क के माध्यम से निर्धारित करता है। फिर, फ़ाइल एक्सटेंशन के साथ, यह संबंधित दृश्य फ़ाइल ढूंढना चाहता है, इसे एक प्रतिक्रिया में प्रस्तुत करता है और इसे वापस ग्राहक को भेजता है। विचार यह है कि यह सामग्री वार्ता के प्रति अनुरोधित प्रतिनिधित्व में अनुरोधित संसाधन के साथ प्रतिक्रिया करता है। routing logic केवल एक दृश्य निर्दिष्ट करता है, लेकिन सामग्री बातचीत के बारे में कोई जानकारी नहीं है। यह रूटिंग तर्क के बाहर होता है जो अधिक लचीला डिज़ाइन बनाता है।

http://blog.joeyguerra.com/index.json और एक JSON प्रतिनिधित्व http://blog.joeyguerra.com/index.phtml हो और आंशिक मिलता है (या एक HTML टुकड़ा) एचटीएमएल प्रतिनिधित्व http://blog.joeyguerra.com/index.xml और मिलती है:

इस डिजाइन के परिणाम की तरह संसाधन की एक विशेष प्रतिनिधित्व के लिए पूछने के लिए की क्षमता है एक एक्सएमएल प्रतिनिधित्व।

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