couchbase-driver
An improved version of the official Couchbase driver.
Installation
npm install couchbase-driver
Overview
A simple alternative driver for Couchbase that wraps the Bucket
from existing driver with the following modifications:
get
works on a single key or an array of keys, calling Bucket.getMulti
if appropriate. Automatically handles
key not found errors and doesn't return an error in that scenario. In case of multiple keys, optionally returns an
array of missing keys.remove
also handles key not found errors more gracefully.- adds
atomic
function that tries to do perform get
+ transform
+ specified database operation utilizing CAS
in one step until success or maximum retries have occurred. - adds
Promise
support so that functions call be called with either Node-style callbacks or with Promises.
Usage
Creating:
const couchbase = require('couchbase');
const create = require('couchbase-driver').create;
const cluster = new couchbase.Cluster('couchbase://127.0.0.1');
const bucket = cluster.openBucket('default');
const driver = create(bucket);
Simple retrieval:
driver.get('my_doc_key', (err, res) => {
if (err) return console.log(err)
console.dir(res.value)
});
If key does not exist err
and res
will be undefined.
Getting multiple documents:
driver.get(['my_doc_key_1', 'my_doc_key_2', 'my_missing_doc_key_3'], (err, results, missing) => {
if (err) return console.log(err);
if (mising.length > 0) console.dir(missing);
console.dir(res.value);
});
"Atomic" transformations can be achieved using the atomic
function which attempts to do get
+ transform
+
specified database operation where CAS
in get
and the final operation have to match. This uses async.retry
until successful or maximum retries have occurred,
which can be specified in the Driver
construction or as function option parameter.
function transform(doc) {
doc.foo = 'bar';
return {
value: doc,
action: Driver.OPERATIONS.UPSERT
};
}
driver.atomic('my_doc_key', transform, (err, res) => {
if(err) return console.dir(err);
console.dir(res);
});
With promises:
const result = await driver.get('mykey');
console.dir(result.value);
Note that with Promise style call and multiple keys we do not get misses.
const results = await driver.get(['mykey1', 'mykey2']);
console.dir(_.map(results, 'value'));
API Reference
Driver
A simple alternative driver for Couchbase that wraps the Bucket
from existing driver and improves
get
and remove
methods and adds atomic
method.
Kind: global class
new Driver(bucket, options)
Constructs the new instance. This should not be called directly, but rather use create()
.
Param | Type | Description |
---|
bucket | Object | the Couchbase Bucket |
options | Object | Options |
options.atomicRetryTimes | Number | The number of attempts to make within atomic() . See async.retry . Default: 5 . |
options.atomicRetryInterval | Number | The time to wait between retries, in milliseconds, within atomic() . See async.retry . Default: 0 . |
options.missing | Boolean | Whether to return missing. If false Does not return. Useful for certain contexts. |
driver.OPERATIONS
Get operation enums
Kind: instance property of Driver
Example
driver.OPERATIONS.UPSERT;
driver.get(keys, options, fn)
A simplified get. Properly handles key not found errors. In case of multi call, returns array of found
and an array of misses.
Kind: instance method of Driver
Param | Type | Description |
---|
keys | String | Array | a single key or multiple keys |
options | Object | Options for bucket get function |
options.missing | Boolean | Whether to return missing. If false Does not return. Useful for certain contexts. This option takes presidence over the one set in constructor. |
fn | function | callback |
Example
driver.get('my_doc_key', (err, res) => {
if (err) return console.log(err)
console.dir(res.value)
}
Example
driver.get(['my_doc_key_1', 'my_doc_key_2', 'my_missing_doc_key_3'], (err, results, missing) => {
if (err) return console.log(err);
if (mising.length > 0) console.dir(missing);
console.dir(res.value);
});
driver.remove(key, options, fn)
Our implementation of Bucket.remove
that properly ignores key not found errors.
Kind: instance method of Driver
Param | Type | Description |
---|
key | String | document key to remove |
options | Object | Options to pass to Bucket.remove |
fn | function | callback |
Example
driver.remove('my_doc_key', (err, res) => {
if (err) return console.log(err);
});
driver.atomic(key, transform, options, fn)
Performs an "atomic" operation where it tries to first get the document given the key
, then perform
the function transform
on the value and then write using the CAS value in the upsert
.
If the upsert fails due to a CAS value error, the whole process is retried.
Kind: instance method of Driver
Param | Type | Description |
---|
key | String | document key |
transform | function | synchronous function to be performend on the document value. Function accepts the document or undefined if the document was not found. The function should perform any necessary mutation and return an object with value and action . value is the new value of the document. action should be one of OPERATIONS specifying the action to take with the new value. |
options | String | Options |
options.atomicRetryTimes | Number | The number of attempts to make within atomic() . See async.retry . Default: 5 . |
options.atomicRetryInterval | Number | The time to wait between retries, in milliseconds, within atomic() . See async.retry . Default: 0 . |
fn | function | callback |
Example
function transform(doc) {
doc.foo = 'bar';
return {
value: doc,
action: OPERATIONS.UPSERT
};
}
driver.atomic('my_doc_key', transform, (err, res) => {
if(err) return console.dir(err);
console.dir(res);
});
Driver.OPERATIONS
Get operation enums
Kind: static property of Driver
Example
const Driver = require('couchbase-driver').Driver;
console.log(Driver.OPERATIONS.UPSERT);
Driver.isKeyNotFound(err)
Determines if error is a "key not found" error
Kind: static method of Driver
Param | Type | Description |
---|
err | Error | the error to check |
Example
Driver.isKeyNotFound(err);
OPERATIONS : enum
Enum for Database operations
Kind: global constant
Read only: true
Properties
Name | Type | Default | Description |
---|
UPSERT | string | "upsert" | Upsert operation |
REMOVE | string | "remove" | Remove operation |
NOOP | string | "noop" | No operation or action |
create(bucket, options) ⇒ Driver
Create a Driver object by wrapping the Couchbase bucket and creates a new Driver
instance and
adds Promise
support to the instance.
Kind: global function
Param | Type | Description |
---|
bucket | Object | The Couchbase Bucket instance to wrap. |
options | Object | Options |
options.atomicRetryTimes | Number | The number of attempts to make within atomic() . See async.retry . Default: 5 . |
options.atomicRetryInterval | Number | The time to wait between retries, in milliseconds, within atomic() . See async.retry . Default: 0 . |
Example
const couchbase = require('couchbase');
const create = require('couchbase-driver').create;
const cluster = new couchbase.Cluster('couchbase://127.0.0.1');
const bucket = cluster.openBucket('default');
const driver = create(bucket);
License
Copyright 2016 Bojan D.
Licensed under the MIT License.