2012-02-27 6 views
5

साथ ठीक से काम नहीं। हालांकि, मैं चाहता हूं कि इन प्रोफाइलों को 2 अलग यूआरएल /profile/nickname और /profile/id के माध्यम से accesed किया जाए ताकि उपयोगकर्ता का उपनाम या उपयोगकर्ता आईडी का उपयोग करके प्रोफ़ाइल को accesed किया जा सके। मैं निम्नलिखित कोड की कोशिश की:

app.get("/profile/:id", function(req, res) { 

User.findOne({ $or : [{ "nickname": req.params.id },{ "_id": req.params.id }] }, function(err, user) { 
    if(user) 
    { 
     res.render('users/profile.jade', { 
     locals: { 
      currentUser: user, 
      title: user.nickname +"'s Profile", 
      jsf:[], 
     } 
     }); 
    } 
    else 
    { 
     res.render('404.jade', { 
      status: 404, 
      title: 'Page Not Found', 
       jsf: [] 
     }); 
    } 
}); 
}); 

समस्या यह है, ऐसा लगता है कि यह केवल आईडी के साथ और प्रचलित नाम से नहीं काम कर रहा है लगता है, जिसका अर्थ है कि अगर मैं acces /profile/4f4ae474546708b219000005 चीजें काम, लेकिन अगर मैं /profile/mmellad का उपयोग जो है उस उपयोगकर्ता के लिए उपनाम दिया गया, मुझे 404 पृष्ठ मिल गया।

वहाँ भी एक और बात मैं पता लगा कि प्रचलित नाम के लिए ठीक काम करता है, जो इस मामले /profile/mmellado ठीक काम करता है में

User.findOne({ "nickname": req.params.id } } 

को

User.findOne({ $or : [{ "nickname": req.params.id },{ "_id": req.params.id }] } 

से क्वेरी को बदलने लेकिन उपयोग कर रहा है उपयोगकर्ता आईडी स्पष्ट रूप से नहीं करता है।

ऐसा करने का सही तरीका क्या होगा? मुझे लगता है कि मैं गलत दृष्टिकोण का उपयोग कर रहा हूं।

एक और बात का उल्लेख है कि अगर मैं मोंगो कंसोल में निम्न कोड का प्रयास करें, यह ठीक के रूप में अच्छी तरह से काम कर रहा है:

x = db.users.findOne({ $or: [ {nickname:"mmellado"}, {_id:ObjectId("4f4ae474546708b219000005")} ]}) 

मैं सही उपनाम और एक गलत _ id डालने से उस कोड का परीक्षण किया है, तो परीक्षण किया एक गलत उपनाम और सही _id के साथ। दोनों स्थितियों में, x ने मुझे आवश्यक रिकॉर्ड के लिए ऑब्जेक्ट युक्त अंत किया।

मुझे लगता है मैं एक अतिरिक्त मार्ग के साथ इसे ठीक करने में सक्षम हो सकता लगता है, लेकिन इतना मुझे यकीन है कि क्या उचित दृष्टिकोण होगा नहीं कर रहा हूँ मैं सभी को एक साथ Node.js और एक्सप्रेस के लिए नया हूँ।

धन्यवाद!

+0

आप किस मोंगो का उपयोग कर रहे हैं? मार्कोस-Mellados-आईमैक-2:: –

+0

मोंगो संस्करण निम्न है ~ मार्कोस $ mongod --version डाटाबेस संस्करण v2.0.2, pdfile संस्करण 4.5 सोम 27 फ़र, 02:48:11 Git संस्करण: 514b122d308928517f5841888ceaa4246a7f18e3 –

उत्तर

4

आप कंसोल में इस प्रयास किया है: x = db.users.findOne({ $or: [ {nickname:"mmellado"}, {_id:ObjectId("mmellado")} ]})। उपनाम मिलान होने पर भी आपको एक त्रुटि दिखाई देगी क्योंकि यह पहले ऑब्जेक्ट आईडी में "mmellado" को परिवर्तित करने की कोशिश करता है और विफल रहता है। उपनाम का उपयोग करते समय आपका पृष्ठ विफल हो सकता है।

मुझे node.js mongodb-driver internals नहीं पता है, लेकिन यह शायद "_id" फ़ील्ड के लिए पूछताछ करने से पहले ऑब्जेक्ट आईडी में तर्क को रूपांतरित करने का प्रयास करता है (और मान्य होने पर असफल)। मैंने यह जांच नहीं की, इसलिए इसे आज़माएं। कॉलबैक पर गलती ऑब्जेक्ट की जांच करने का भी प्रयास करें। यदि यह समस्या एक ही रास्ता हल करने के लिए इस जांच करने के लिए है, उदाहरण के लिए इसे से बाहर अपने आप को और पकड़ अपवाद ObjectId बनाने अगर यह विफल रहता है, तर्क क्वेरी करने से पहले वैध ObjectId है। कुछ इस तरह (परीक्षण नहीं):

try { 
    var objectId = createObjectId(req.params.id); // Create this function yourself 
    User.findOne({ "_id": objectId }, callbackFunction); 
} catch (err) { 
    // Fall back to using nickname 
    User.findOne({ "nickname": req.params.id }, callbackFunction); 
} 
+0

मैंने कोशिश की क्वेरी समय पर त्रुटि कोड मुद्रित करना। यह मुझे मिलता है: [त्रुटि: अमान्य ऑब्जेक्ट आईडी], मेरी धारणा यह है कि जब मैं फिंच को एक परम के रूप में उपयोग करने का प्रयास करता हूं, और स्थिति _id भाग के माध्यम से जाती है, क्योंकि दी गई स्ट्रिंग मान्य ऑब्जेक्ट आईडी नहीं है, क्वेरी ब्रेक हो जाती है, एक त्रुटि लौटती है ... इसलिए परिणाम देने के बावजूद भी परिणाम नहीं दे रहा है ... इस पर काम करने के तरीके पर कोई विचार? –

+0

@MarcosMellado यह मेरे विचारों का समर्थन करने लगता है। मैंने अपनी पोस्ट में समाधान का प्रस्ताव दिया है, मैंने इसे और अधिक स्पष्ट करने के लिए कुछ नमूना कोड जोड़ने के लिए इसे संशोधित किया है। – Lycha

+0

मैं वास्तव में एक बहुत ही समान समाधान में आया था, मैं इसे पकड़ने के साथ काम करने के लिए उचित परिवर्तन करूँगा और आपको यह बताएगा कि यह काम करता है :) –

0

डिफ़ॉल्ट _ id मान 12 बाइट बाइनरी हैश, ताकि आप पहले इससे पहले कि आप इस तरह ObjectID.createFromHexString का उपयोग कर क्वेरी भेजने बाइनरी में स्ट्रिंग परिवर्तित करने के लिए की जरूरत है:

var id = ObjectID.createFromHexString(idHex); 

फिर अपनी क्वेरी में आईडी का उपयोग करें।

आपका कोड कुछ इस तरह दिखना चाहिए:

User.findOne({ $or : [{ "nickname": req.params.id },{ "_id": ObjectID.createFromHexString(req.params.id) }] }, function(err, user) { ........ 

अभिवादन फिंच !!!

+0

आप ऑब्जेक्टआईडी को कैसे परिभाषित करेंगे? अभी मेरे पास mongoose = आवश्यकता है ('mongoose'), \t \t ऑब्जेक्ट आईडी = mongoose.Schema.ObjectId, –

+0

अंतिम टिप्पणी को अनदेखा करें, उसके दृष्टिकोण के साथ समस्या एक पैरामीटर के रूप में उपनाम भेजने और इसे पारित करने के समय है createFromHexString फ़ंक्शन के माध्यम से, यह अगली त्रुटि फेंकता है: त्रुटि: पास किया गया तर्क 12 बाइट्स का एक स्ट्रिंग या हेक्स प्रारूप में 24 हेक्स वर्णों की एक स्ट्रिंग होना चाहिए (माना जाता है कि उपनाम उदाहरण के लिए फिंच है) –

+0

ट्यूर, पहले कनवर्ट करने का प्रयास करें आपकी स्ट्रिंग (फिंच) का उपयोग हेक्स स्ट्रिंग में: var hexString = nickname.toHexString(); - फिर अपने ऑब्जेक्ट आईडी बनाने के लिए तर्क के रूप में पास करें – user313551