Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,15 @@ It uses callbacks that follow node.js conventions and aims to be as expressive a
// if you chose a non-existant db, you'd get { error: "not_found", reason: "no_db_file" } in place of `err`
});

// It utilizes mikeal's [request module](https://github.com/mikeal/request) and exposes its methods via setRequestOptions method call on any couchdb entity
//i.e.
db.setRequestOptions({
timeout: 2000,
// oauth signing, aws auth can be put here...
}).info(function(err, response){
console.log(response);
});

Refer to [my website](http://www.dbarnes.info/node-couchdb-api/) for documentation and resources.

## Changelog
Expand Down
30 changes: 29 additions & 1 deletion lib/client.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,25 @@ var request = require("request").defaults({ encoding: "utf8" }),
_ = require("underscore"),
proto = {};

/**
* Request options overrides
* @param Object
*/
proto._requestOpts = {};

/**
* Method that allows to override
* request defaults such as headers, timeout etc
* @see https://github.com/mikeal/request
* @param {Object} [options]
*
* @return {Object} chainable
*/
proto.setRequestOptions = function(options) {
_.extend(this._requestOpts, options);
return this;
}

/**
* Prepares the URL options before a request
*
Expand Down Expand Up @@ -201,7 +220,9 @@ proto._get = function (url, options, callback) {

options = options || {};
this._set_url(url, options);

_.extend(options, this._requestOpts);
this._requestOpts = {};

if (options.stream) {
if (!options.changes) {
options.encoding = null;
Expand Down Expand Up @@ -242,6 +263,9 @@ proto._put = function (url, body, options, callback) {

options = options || {};
this._set_url(url, options);
_.extend(options, this._requestOpts);
this._requestOpts = {};

if (options.stream) {
body.pipe(request.put(options, this._callback(callback, options)));
} else {
Expand Down Expand Up @@ -282,6 +306,8 @@ proto._post = function (url, body, options, callback) {
options = options || {};
this._set_url(url, options);
this._set_body(body, options);
_.extend(options, this._requestOpts);
this._requestOpts = {};

request.post(options, this._callback(callback, options));
return this;
Expand Down Expand Up @@ -309,6 +335,8 @@ proto._del = function (url, options, callback) {

options = options || {};
this._set_url(url, options);
_.extend(options, this._requestOpts);
this._requestOpts = {};

request.del(options, this._callback(callback, options));
return this;
Expand Down
42 changes: 42 additions & 0 deletions test/request.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
var _ = require("underscore"),
test = require("assert"),
config = require("./config"),
couchdb = require("../"),
server = couchdb.srv(config.url);

module.exports = {
before: function (done) {
if (!config.party) {
server.auth = [ config.user, config.pass ];
}
done();
},
after: function (done) {
done();
},

"Request": {
"Test chaining": function (done) {
test.strictEqual(server, server.setRequestOptions( { form: {} } ));
done();
},

"Timeout occure": function(done) {
server.setRequestOptions({timeout:1}).info(function(err, body){
test.notEqual(err, null);
test.ok( err.code === 'ETIMEDOUT' || err.code === 'ESOCKETTIMEDOUT' );
test.equal(server._requestOpts, {});
done();
});
},
"Options are reset on the server object": function(done) {
server.info(function(err, body){
test.ifError(err);
if (!err) {
test.equal(body.couchdb, "Welcome");
}
done();
})
}
}
};