2011-10-05 66 views
5

有沒有辦法在初始化後更改nano中的配置參數?我想通過以下方式初始化nano:使用node.js,nano和CouchDB進行身份驗證

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

及更高版本在用戶提交登錄表單後更改用戶名和密碼。我總是得到一個錯誤:

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

或者我應該納米叉,寫一個auth功能調整值是多少?

回答

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

我現在不能測試,但,看着來源,你可以注意到兩兩件事:

那麼我認爲你需要在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; 

UPDATE:這裏有一個完整的例子:

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

不幸的是,也從url生成的路徑。我嘗試了幾種可能性,並最終將身份驗證標頭。 – Patrick

+0

@Patrick我不確定要理解你的意思,所以我添加了一個工作示例來解釋我的意思。我希望這有助於澄清。 –

+0

非常感謝,我一開始就試過。但是,我發現了一些http認證來源,這比重寫整個cfg代碼更容易。我請求拉入節點庫,所以我希望很快會有更新。 – Patrick