使用node.js,nano和CouchDB进行身份validation

在初始化后,有没有办法在nano中更改configuration参数? 我想通过以下方式启动nano:

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

并在用户提交login表单后更改用户名和密码。 我总是得到一个错误:

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

或者我应该分叉纳米和写一个身份validationfunction来调整值?

我现在无法testing它,但是,从源头上看,可以注意到两点:

  • 该configuration暴露为config ,而不是cfg ;
  • 连接的configuration选项是url

那么我认为你需要将URLconfiguration选项设置为带有authentication参数的新值:

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

或者你可以像在couch.example.js中一样保留一个configuration对象,并执行如下操作:

 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); }); 

身份validation可以作为http头部分的一部分发送:

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

用户名和密码可以用“auth”function设置:

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