2016-10-08 5 views
6

कहा जाता है मेरे पास दो एक्सप्रेस मिडलवेयर हैं जहां कोई रेक पर ऑब्जेक्ट सेट कर रहा है और दूसरा इसके बाद उस ऑब्जेक्ट को स्विच स्टेटमेंट चालू करने के लिए उपयोग करता है।req पर ऑब्जेक्ट सेट करना। दो middlwares के पहले में मौजूद नहीं है जब दूसरे मिडलवेयर को

यहाँ एक उदाहरण है: नीचे

module.exports = (req, res, next) => { 
    if (!req.headers.authorization) { 
    return res.status(401).end() 
    } 
    const token = req.headers.authorization.split(' ')[1] 
    return jwt.verify(token, config.database.jwtSecret, (err, decoded) => { 
    if (err) { return res.status(401).end() } 

    const userId = decoded.sub 
    return User.findById(userId, (userErr, user) => { 
     if (userErr || !user) { 
     return res.status(401).end() 
     } 
     req.user = { 
     _id: user._id, 
     name: user.name 
     } 
     return next() 
    }) 
    }) 
} 

    //My route 
     userpage.get('/', authCheck, (req, res) => { 
      return Event.findOne() 
      .populate('attending.user', 'name') 
      .exec((err, newEvent) => { 
      if (err) { 
       console.log(err) 
       res.status(400).end() 
      } 
      let uids = [] 
      let imAttending = false 
      newDinner.attending.user.map(obj => { 
       uids.push(obj._id) 
       }) 
      console.log(uids) // Shows the array with all uids 
      // Double checked that it is indeed an array 
      let isArr = Object.prototype.toString.call(uids) === '[object Array]' 
      console.log(isArr) // true 
      console.log(req.user._id) // Shows the id and it's indeed matching one of the ids in the uids array 
      imAttending = uids.indexOf(req.user._id) > -1 
      console.log(imAttending) // false <--- Should be true 
      // Test 
      let id = '57ec2203ba3e994c7c9d5832' // I litraly copy pasted that from the console.log(req.user._id) 
      imAttendingII = uids.indexOf(id) > -1 
      console.log(imAttendingII) // true ???? what the heck? 
      // checking it's the same type as suggested in one of the comments 
      let check = ['57ec2203ba3e994c7c9d5832'].indexOf(req.user._id) === -1 
      console.log(check) //true 
      }) 
     }) 

टिप्पणियां मुझे आश्वस्त है कि यह एक async मुद्दा नहीं है और परिणाम मुझे लगता है मैं यह क्या हो सकता है पर खो रहा हूँ हो रही है के बाद।

संपादित करें: हालांकि निम्न कार्य करता है, और सत्य दिखाता है। लेकिन _ id felds पर जाँच भी _ id तत्व पर uids.indexOf(req.user._id.toString()) > -1 करने के बाद काम नहीं करता:

newEvent.attending.user.map(obj => { 
     names.push(obj.name) 
    }) 
    imAttending = names.indexOf(req.user.name) > -1 // imAttending = true 
+0

ऐसा लगता है कि आप एक हल किए गए वादे – marekful

+0

से पहले मिडलवेयर में अगला() को कॉल करना चाहते हैं तो अगला फ़ंक्शन कॉल होने तक मिडलवेयर अगले मध्यवर्ती तक नहीं पहुंच जाएगा। चूंकि आप इसे केवल एसिंक फ़ंक्शन में कॉलबैक में बुला रहे हैं, इसलिए इसे अगले हैंडलर पर जाने से पहले सेट करने के लिए पहले से ही req.user की प्रतीक्षा करनी चाहिए। – DTing

+0

आपका कोड जो आप अभी दिखाते हैं वह केवल डीबी राउंड ट्रिप को पूरा करने और 'req.user' प्रॉपर्टी को सेट करने के बाद 'अगली()' कॉल करेगा। नीचे मेरा जवाब देखें, यह कहीं और समस्या हो सकती है। – Paul

उत्तर

2

प्रश्न में उपलब्ध कराई गई अतिरिक्त जानकारी की वजह से एक और उत्तर जोड़ने का निर्णय लिया।

ऐसा लगता है कि आप MongoDB और Mongoose का उपयोग कर रहे हैं (जो टैग में होना चाहिए यदि मैं सही हूं)। यह देखते हुए कि, उपयोगकर्ता दस्तावेज़ की _id संपत्ति इसके स्ट्रिंग रूप के बराबर न हो, क्योंकि प्रतिनिधित्व वास्तव में ObjectID('blahblahblah') है, यह वास्तव में हुड के नीचे एक स्ट्रिंग नहीं है। यदि आप console.log() करते हैं, तो यह एक स्ट्रिंग की तरह दिखेगा क्योंकि console.log अपने हुड के नीचे toString() को कॉल करता है।

तो मूल्यांकन आप कोशिश करना चाहते हो सकता है:

imAttending = uids.indexOf(req.user._id.toString()) > -1; 
console.log(imAttending); // should be true 

एक तरफ ध्यान दें के रूप में, यह भी वजह है कि यह node-inspector की तरह कुछ का उपयोग करने के breakpoints स्थापित करने और अपने कोड के माध्यम से कदम है, बजाय के लिए एक महान कारण नहीं है डीबग करने के लिए कंसोल स्टेटमेंट पर भरोसा करते हैं। आप उनके कड़े फॉर्म के बजाय विभिन्न बिट्स का वास्तविक प्रतिनिधित्व देखेंगे।

+0

मैंने इसे आजमाया है और यह अभी भी झूठा है जो बेहद अजीब है क्योंकि जब मैंने नाम पर मैच की जांच करने के लिए स्विच किया है, तो दूसरा पैरामीटर है जिसे मैं req.user ऑब्जेक्ट पर सेट कर रहा हूं, यह बस ठीक काम करता है। हो सकता है कि मुझे आईडी की सूची को चालू करने की ज़रूरत है, मैं स्ट्रिंग्स में यूड्स सरणी में जोड़ रहा हूं? ओह और हाँ मैं मोंगोज़ का उपयोग कर रहा हूं, मैं इसे टैग में जोड़ दूंगा। –

+0

मुझे लगता है कि वास्तव में 'uid' var के भीतर समस्या हो सकती है, जब' newDinner 'के माध्यम से मैपिंग करते समय, mongo * हो सकता है * '_id' को अपनी अनूठी आईडी के रूप में सहेजा गया हो। तो शायद इसे 'toString()' के साथ कास्ट करना इसे हल करने में मदद करेगा? – Derek

+1

ठीक है, किसी भी तरह से @ एस।शेन्क आपको यह जानने के लिए कि क्या हो रहा है और क्यों वे बराबर नहीं हैं, तुलनात्मक मूल्य (प्रकार जांच सहित) की तुलना में आप जिन मूल्यों की तुलना कर रहे हैं उनका निरीक्षण करने की आवश्यकता है। जैसे नोड-इंस्पेक्टर का उपयोग करने की मेरी सिफारिश। – Paul

0

यह सभी के साथ स्ट्रिंग() का मुद्दा था। डीबी से पूछताछ से वापस आने वाले परिणाम जरूरी नहीं हैं कि आपको लगता है कि यह हो सकता है।

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