2011-03-14 10 views
6

मैं "नोडजेस" में "एक्सप्रेस" और "क्रैडल" का उपयोग कर रहा हूं। अगर मैं अपने डेटाबेस का अनुरोध करता हूं तो मुझे प्रतिक्रिया को संभालने के लिए कॉलबैक को परिभाषित करना होगा। दुर्भाग्य से मेरे पास मेरे कॉलबैक फ़ंक्शन में res (प्रतिक्रिया) तक कोई पहुंच नहीं है। इस समस्या के लिए सबसे अच्छा अभ्यास क्या है? मेरा कोड यहाँ है।कॉलबैक फ़ंक्शंस में प्रतिक्रिया को कैसे प्रबंधित करें (उदाहरण के लिए नोडजेज़ में पालना द्वारा उपयोग किया जाता है)

var cradle = require('cradle'); 
var db = new cradle.Connection().database('guestbook'); 
app.get('/guestbook', function(req, res) { 
    db.view('guestbook/all', function(err, doc) { 
    console.log(doc); 
    // How can I use res in this callback 
    // to send the response? 
    }); 
}); 

उत्तर

10

आप आंतरिक कॉलबैक के अंदर केवल res का उपयोग कर सकते हैं।

जावास्क्रिप्ट में आंतरिक कार्य बाहरी कार्य के चर "विरासत" प्राप्त करता है। या अधिक सटीक रूप से, फ़ंक्शन एक बंदरगाह बनाता है, जो एक अभिव्यक्ति है जिसमें मुक्त चर हो सकते हैं। बंदरगाह अपने बाहरी दायरे से चर को बांधता है, जो किसी अन्य कार्य या वैश्विक दायरे का दायरा हो सकता है।

1

इस स्निपेट के साथ आपको वास्तव में यहां पहुंचने की पहुंच होनी चाहिए। आपको res.render() या res.send() का उपयोग करने में सक्षम होना चाहिए क्योंकि डीबी कॉलबैक app.get कॉलबैक फ़ंक्शन को बंद करने में लपेटा गया है।

3

आप इसे आजमा सकते हैं।

सबसे महत्वपूर्ण (शायद आपका pitfall?) ध्यान रखें कि 'db.view' केवल कॉलबैक बंद कर देगा और जारी रखेगा। इस अनुरोध के बाहर कहीं भी अपना अनुरोध बंद करें ('req.end' को कॉल करके)। यदि आप करते हैं, तो शायद डीबी रिटर्न के रूप में अनुरोध बंद कर दिया गया है। एक बार जब http प्रतिक्रिया ऑब्जेक्ट बंद हो जाता है तो उसे लिखा गया कोई भी डेटा शून्य हो जाता है।

var cradle = require('cradle'); 
var db = new cradle.Connection().database('guestbook'); 
app.get('/guestbook', function(req, res) { 
    // Register callback and continue.. 
    db.view('guestbook/all', function(err, guests) { 
     // console.log('The waiting had an end.. here are the results'); 
     guests.forEach(function(guest) { 
      if (guest.name) { 
       res.write('Guest N: ' + guest.name); 
      } 
     }); 
     // Close http response (after this no more output is possible). 
     res.end('That is all!') 
    }); 
    console.log('Waiting for couch to return guests..'); 
    // res.end('That is all!'); // DO NOT DO THIS!!! 
});