rethinkdbdash
An experimental (yet stable) Node.js driver for RethinkDB with promises and a connection pool.
Note: To use yield
as shown in the examples, you have to start node
unstable (>= 0.11) with
the --harmony
flag.
Quick start
Example wih koa:
var app = require('koa')();
var r = require('rethinkdbdash')();
app.use(function *(){
var result = yield r.table("foo").get("bar").run();
this.body = JSON.stringify(result);
});
app.listen(3000);
Example with bluebird:
var Promise = require('bluebird');
var r = require('rethinkdbdash')();
var run = Promise.coroutine(function* () {
var result
try{
result = yield r.table("foo").get("bar").run();
console.log(JSON.stringify(result, null, 2));
}
catch(e) {
console.log(e);
}
})();
Note: You have to start node with the --harmony
flag.
Install
npm install rethinkdbdash
The rethinkdbdash-unstable
package is a relic from the past when the driver had a dependency on node-protobuf
.
Documentation
While rethinkdbdash uses almost the same syntax as the official driver, there are still
a few differences.
This section references all the differences. For all the other methods not
mentionned here, please refer to the
official driver's documentation.
The differences are:
Module name
Import rethinkdbdash:
var r = require('rethinkdbdash')(options);
options
can be:
{pool: false}
-- if you do not want to use a connection pool.- the options for the connection pool, which can be:
{
min: <number>,
max: <number>,
bufferSize: <number>,
timeoutError: <number>,
timeoutGb: <number>,
maxExponent: <number>
}
Promises
Rethinkdbdash uses promises and not callback.
RethinkDB >= 1.13 handles both syntaxes.
Example 1 with yield
:
try{
var cursor = yield r.table("foo").run();
var result = yield cursor.toArray();
}
else {
console.log(e.message);
}
Example 2 with yield
:
try{
var cursor = yield r.table("foo").run();
var row;
while(cursor.hasNext()) {
row = yield cursor.next();
}
}
else {
console.log(e.message);
}
Example with then
and error
:
r.table("foo").run().then(function(connection) {
}).error(function(e) {
console.log(e.mssage)
})
Connection pool
Rethinkdbdash implements a connection pool and is created by default.
If you do not want to use a connection pool, iniitialize rethinkdbdash with {pool: false}
like this:
var r = require('rethinkdbdash')({pool: false});
You can provide options for the connection pool with the following syntax:
var r = require('rethinkdbdash')({
min: <number>,
max: <number>,
bufferSize: <number>,
timeoutError: <number>,
timeoutGb: <number>,
maxExponent: <number>
});
try {
var cursor = yield r.table("foo").run();
var result = yield cursor.toArray();
}
catch(e) {
console.log(e.message);
}
Get the number of connections
r.getPool().getLength();
Get the number of available connections
r.getPool().getAvailableLength();
Drain the pool
r.getPool().drain();
Note: If a query returns a cursor, the connection will not be released as long as the
cursor hasn't fetched everything or has been closed.
Cursor
Rethinkdbdash does not extend Array
with methods and returns a cursor as long as your
result is a sequence.
var cursor = yield r.expr([1, 2, 3]).run()
console.log(JSON.stringify(cursor))
var result = yield cursor.toArray();
console.log(JSON.stringify(result))
Errors
Long backtraces are split on multiple lines.
In case the driver cannot serialize the query, it provides a better location of the error.
The server may return confusing error messages when the wrong number
of arguments is provided (See issue 2463 to track progress).
Rethinkdbdash tries to make up for it by catching errors before sending
the query to the server if possible.
Miscellaneous
The maximum nesting depth is your documents is by default 100 (instead of 20).
You can change this setting with
r.setNestingLevel(<number>)
The tree representation of the query is built step by step and stored which avoid
recomputing it if the query is re-run.
If you do not wish to use rethinkdbdash connection pool, you can implement yours. The
connections created with rethinkdbdash emits a "release" event when they receive an
error, an atom, or the end (or full) sequence.
A connection can also emit a "timeout" event if the underlying connection times out.
undefined
values in an object
Rethinkdbdash will ignore the keys/values where the value is undefined
.
Run tests
Update test/config.js
if your RethinkDB instance doesn't run on the default parameters.
Run
mocha --harmony-generators
Tests are also being run on wercker: