rethinkdbdash

A Node.js driver for RethinkDB with promises and a connection pool.
This is the branch stable
for the last stable version of Node (currently 0.10.26
).
The tests for this branch are ridiculously few. The main tests are run with Node 0.11.10
.
Quick start
Example wih express:
var app = require('express')();
var r = require('rethinkdbdash')();
app.use(function(req, res, next){
r.table("foo").get("bar").run().then(function(result) {
this.body = JSON.stringify(result);
}).error(function(error) {
res.status(500);
res.render('error', { error: error });
});
})
app.listen(3000);
Install
- Install the
libprotobuf
binary and development files (required to build node-protobuf
in the next step). - Install rethinkdbdash with
npm
.
npm install rethinkdbdash
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>,
}
Promises
Rethinkdbdash returns a bluebird promise when a method in the official driver
takes a callback.
Example:
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 that:
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>,
});
r.table("foo").run().then(function(cursor) {
cursor.toArray().then(function(result) {
})
})
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.
r.expr([1, 2, 3]).run().then(function(cursor) {
console.log(JSON.stringify(cursor))
cursor.toArray().then(function(result) {
console.log(JSON.stringify(result))
})
})
Errors
Long backtraces are split on multiple lines.
In case the driver cannot parse the query, it provides a better location of the error.
- Different handling for queries that cannot be parsed on the server.
In case an error occured because the server cannot parse the protobuf message, the
official driver emits an error
on the connection.
Rethinkdbdash emits an error and rejects all queries running on this connection and
close the connection. This is the only way now to avoid having some part of your
program hang forever.
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.
exprJSON
, internal method used by insert
, is more efficient in the worst case.
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.
Run tests
Update test/config.js
if your RethinkDB instance doesn't run on the default parameters.
Run
npm test
Tests are also being run on wercker:
Roadmap
============
- Pre-serialize a query (not sure if possible though)