2011-10-05 35 views
5

Başlatmadan sonra nano'daki yapılandırma parametrelerini değiştirmenin bir yolu var mı? Bir kullanıcı giriş formu gönderdiğinde sonra,node.js, nano ve CouchDB ile kimlik doğrulama

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

ve sonraki değişiklik, kullanıcı ve şifre: Birlikte nano init istiyorum. Hep bir hata alıyorum:

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

Yoksa nano çatal ve değerleri ayarlamak için bir auth işlevini yazmalıyım?

cevap

1

kimlik http başlığının bir parçası olarak göndermek olabilir:

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

kullanıcı adı ve şifre bir 'auth'-fonksiyonu ile ayarlanabilir:

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

Şu anda test edemez, ancak, kaynakların bakarak, iki şeye dikkat edebilirsiniz:

  • bu yapılandırma is exposed as config değil cfg;
  • bağlantı için yapılandırma seçeneğinin url olduğunu.

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

    Yoksa couch.example.js gibi bir yapılandırma nesnesi tutmak ve benzeri bir şey yapabilirsiniz:

O zaman kimlik doğrulama parametreleri ile yeni bir değere url yapılandırma seçeneğini ayarlamak gerektiğini düşünüyorum

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

GÜNCELLEME:

: burada tam bir örnek
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

Maalesef da var url'den oluşturulan yol. Birkaç olasılık denedim ve kimlik doğrulamasını üstbilgiye ekledim. – Patrick

+0

@Patrick Ne demek istediğini anlamadım, bu yüzden ne demek istediğimi açıklamak için bir çalışma örneği ekledim. Umarım açıklığa kavuşur. –

+0

Çok teşekkür ederim, bunu en baştan denedim. Ancak, tüm cfg kodunu yeniden yazmaktan daha kolay olan, http kimlik doğrulaması için bir kaynak buldum. Düğüm havuzuna bir çekme talebinde bulundum, bu yüzden güncellemenin yakında orada olacağını umuyoruz. – Patrick

İlgili konular