2011-10-05 13 views
5

के साथ प्रमाणीकरण प्रारंभ करने के बाद नैनो में कॉन्फ़िगरेशन पैरामीटर बदलने का कोई तरीका है? मैं नैनो इनके साथ इनिट करना चाहता हूं:node.js, नैनो और कॉच डीबी

nano = require('nano')('http://127.0.0.1:5984') 

और बाद में उपयोगकर्ता लॉग इन फॉर्म सबमिट करने के बाद उपयोगकर्ता और पासवर्ड बदल देता है। मैं हमेशा कोई त्रुटि मिलती है:

nano.cfg.user = params.user.name 
TypeError: Cannot set property 'user' of undefined 

या मैं नैनो कांटा और मान को समायोजित करने के लिए एक प्रमाणन समारोह लिखना चाहिए?

उत्तर

1

प्रमाणीकरण HTTP शीर्ष लेख के भाग के रूप भेज जा सकता है:

if(cfg.user && cfg.pass) { 
    req.headers['Authorization'] = "Basic " + new Buffer(cfg.user+":"+cfg.pass).toString('base64'); 
} 

यूज़रनेम और पासवर्ड एक 'auth'-समारोह के साथ सेट किया जा सकता:

function auth_db(user, password, callback) { 
    cfg.user = user; 
    cfg.pass = password; 
    return relax({db: "_session", method: "GET"}, callback); 
} 
3

मैं अभी परीक्षण नहीं कर सकते, लेकिन सूत्रों को देखते हुए, आपको दो बातें नोट कर सकते हैं:

  • कि विन्यास is exposed as config, नहीं cfg;
  • कि कनेक्शन के लिए कॉन्फ़िगरेशन विकल्प url है।

    nano.config.url = 'http://' + params.user.name + ':' + params.user.password + '@localhost:5984'; 
    

    या आप couch.example.js में के रूप में एक विन्यास वस्तु रखने के लिए और की तरह कुछ कर सकते हैं::

तो मैं आप प्रमाणीकरण मानकों के साथ एक नया मान यूआरएल विन्यास विकल्प सेट करने की जरूरत है

cfg.user = params.user.name; 
cfg.pass = params.user.password; 
nano.config.url = cfg.url; 

अद्यतन:

: यहाँ एक पूरा उदाहरण है
var cfg = { 
    host: "localhost", 
    port: "5984", 
    ssl: false 
}; 

cfg.credentials = function credentials() { 
    if (cfg.user && cfg.pass) { 
    return cfg.user + ":" + cfg.pass + "@"; 
    } 
    else { return ""; } 
}; 

cfg.url = function() { 
    return "http" + (cfg.ssl ? "s" : "") + "://" + cfg.credentials() + cfg.host + 
    ":" + cfg.port; 
}; 

var nano = require('nano')(cfg.url()), 
    db = nano.use('DB_WITH_AUTH'), 
    docId = 'DOCUMENT_ID'; 

function setUserPass(user, pass) { 
    cfg.user = user; 
    cfg.pass = pass; 
    nano.config.url = cfg.url(); 
} 

db.get(docId, function (e, r, h) { 
    if (e) { 
    if (e['status-code'] === 401) { 
     console.log("Trying again with authentication..."); 
     setUserPass('USENAME', 'PASSWORD'); 
     db.get(docId, function (e, r, h) { 
     if (e) { 
      console.log("Sorry, it did not work:"); 
      return console.error(e); 
     } 
     console.log("It worked:"); 
     console.log(r); 
     console.log(h); 
     }); 
     return; 
    } 
    console.log("Hmmm, something went wrong:"); 
    return console.error(e); 
    } 
    console.log("No auth required:"); 
    console.log(r); 
    console.log(h); 
}); 
+0

दुर्भाग्य से वहाँ भी यूआरएल से उत्पन्न पथ। मैंने कई संभावनाओं की कोशिश की और प्रमाणीकरण को हेडर डाल दिया। – Patrick

+0

@ पैट्रिक मुझे समझ में नहीं आता कि आपका क्या मतलब है, इसलिए मैंने इसका अर्थ समझाने के लिए एक कामकाजी उदाहरण जोड़ा है। मुझे उम्मीद है कि यह स्पष्ट करने में मदद करता है। –

+0

बहुत बहुत धन्यवाद, मैंने शुरुआत में कोशिश की। हालांकि, मुझे http-प्रमाणीकरण के लिए कुछ स्रोत मिला, जो पूरे सीएफजी-कोड को फिर से लिखने से आसान है। मैंने नोड भंडार में खींचने का अनुरोध किया, इसलिए मुझे उम्मीद है कि अपडेट जल्द ही होगा। – Patrick

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