Node-Crate: SQL Driver for CrateDB in Node.js


This is an independent node.js driver implementation for CRATE using the _sql endpoint REST API.

Crate Data "Easy to scale real time SQL data store"

Please note: Crate is a trademark of Crate Technology Gmbh, registered in the E.U. and in other countries.


  1. Async Interface
  2. Conversion from rows to array of JSON entities
  3. Automatic build of SQL statements from JSON or full control with SQL String with placeholders and arguments
  4. Support for BLOB objects (e.g. for image uploads) with inbuilt key generation

Known limitation

Nested JSON objects are currently not supported to generate SQL statements (e.g. for insert/update). We might change this soon.

Breaking changes in version 2 / Migration

Node-crate now using ES6 features and is not compatible anymore with node.js version lower than 6.0.0.

Package is using native promises, instead of promises implementation by D.js package.

Node-crate version 1.x code:

crate.execute("select ...", {}).success(console.log).error(console.error);

Should be updated to node-crate version 2.x:

crate.execute("select ...", {}).then((res) => {...})).catch((err) => {...}))


npm install node-crate


When a crate instance is running on http://localhost:4200 you can use lab based test (test/test.js). Test actions: create table, insert, select, update, delete and drop table.

npm test


var crate = require('node-crate');
crate.connect('localhost', 4200);
// or crate.connect ('http://localhost:4200')
// to use multiple nodes in round robin crate.connect ('http://host1:4200 http://host2:4200')
// to use https crate.connect ('https://host1:4200 https://host2:4200')
crate.execute("select * from tweets where text like ? and retweed=? limit 1", ['Frohe Ostern%', true]).then((res) => {
    // res.json is an array with JSON object, with column names as properties, TIMESTAMP is converted to Date for crate V0.38+
    // res.cols are column names
    // res.rows values as array of arrays
    // res.duration execution time of query
    // res.rowcount number of rows
    // res.col_types type of column, e.g. res.col_types[i] == crate.type.TIMESTAMP
    console.log('Success', res.json, res.duration, res.rowcount, res.cols, res.rows)

execute (sql, args)

crate.execute("select * from tweets where text like ?", ['%crate%']).then((res) => console.log(res))).catch((err) => console.log(err))

insert (tableName, jsonEntity)

crate.insert('mytable', {columnName1: 'value1', columnName2: 'value2'}).then((res) => {})

create (schema)

var schema = {book: {id: 'integer primary key', title: 'string', author: 'string'}}
crate.create(schema).then(() => {})

createIfNotExists (schema)

var schema = {book: {id: 'integer primary key', title: 'string', author: 'string'}}
crate.createIfNotExists(schema).then(() => {})

drop (tableName)

crate.drop('mytable').then(() => {})

update (tableName, jsonEntity, whereClause)

crate.update('mytable', {columnName1: 'value1', columnName2: 'value2'}, 'columnName3=5').then(() => {})

delete (tableName, where)

crate.delete('mytable', "columnName1='value1'").then(() => {})


createBlobTable (tableName, replicas, shards)

crate.createBlobTable('images',1,3).then((res) => {}).catch((e) => {})

insertBlob (tableName, buffer)

crate.insertBlob('images', buffer).then((res) => {});

insertBlobFile (tableName, fileName)

The callback returns the required haskey to get the image with getBlob.

crate.insertBlobFile ('images', './test.png').then((hashKey) => {
    console.log ("Assigned hashkey": hashKey)

getBlob (tableName, hashKey)

The callback return a buffer as result - callback (buffer)

crate.getBlob ('f683e0c9abcbf518704af66c6195bfd3ff121f09').then((data) => {
      fs.writeFileSync ('test.gif', data)

Connect to different instances or clusters

Example connect to localhost and to a crate hosted in a cloud enviroment with authentication

const crateLocal = require('node-crate');
const crateCloud = crateLocal.getNewInstance();


Use in Webbrowsers JavaScript

The intention was to use it with node.js on the server side, but it is possible to make it available in a web browser using browserify.

npm run bundle

The resulting automatically generated using You can refer to this file:

<script src=""></script>

Then you might be able to use it inside of an CRATE-Plug-In HTML page:

<script src="bundle.js"></script>
  var crate = require('node-crate');
  crate.execute ('select * from tweets limit 10').then(window.alert)

Download Details:

Author: megastef
Source Code: 
License: MIT License

#node #nodejs 

Node-Crate: SQL Driver for CrateDB in Node.js
1.45 GEEK