Node-crate
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.
Nested JSON objects are currently not supported to generate SQL statements (e.g. for insert/update). We might change this soon.
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)
})
crate.execute("select * from tweets where text like ?", ['%crate%']).then((res) => console.log(res))).catch((err) => console.log(err))
crate.insert('mytable', {columnName1: 'value1', columnName2: 'value2'}).then((res) => {})
var schema = {book: {id: 'integer primary key', title: 'string', author: 'string'}}
crate.create(schema).then(() => {})
var schema = {book: {id: 'integer primary key', title: 'string', author: 'string'}}
crate.createIfNotExists(schema).then(() => {})
crate.drop('mytable').then(() => {})
crate.update('mytable', {columnName1: 'value1', columnName2: 'value2'}, 'columnName3=5').then(() => {})
crate.delete('mytable', "columnName1='value1'").then(() => {})
crate.createBlobTable('images',1,3).then((res) => {}).catch((e) => {})
crate.insertBlob('images', buffer).then((res) => {});
The callback returns the required haskey to get the image with getBlob.
crate.insertBlobFile ('images', './test.png').then((hashKey) => {
console.log ("Assigned hashkey": 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();
crateLocal.connect('http://localhost:4200');
crateCloud.connect('https://user:password@cratecloud.com:4200');
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 drone.io. You can refer to this file:
<script src="https://drone.io/github.com/megastef/node-crate/files/bundle.js"></script>
Then you might be able to use it inside of an CRATE-Plug-In HTML page:
<script src="bundle.js"></script>
<script>
var crate = require('node-crate');
crate.execute ('select * from tweets limit 10').then(window.alert)
</script>
Author: megastef
Source Code: https://github.com/megastef/node-crate
License: MIT License