Repository files navigation

DataStax Node.js Driver for Apache Cassandra®

A modern, feature-rich and highly tunable Node.js client library for Apache Cassandra and DSE using exclusively Cassandra's binary protocol and Cassandra Query Language.

Installation

$ npm install cassandra-driver

Build StatusBuild status

Features

Documentation

Getting Help

You can use the project mailing list or create a ticket on the Jira issue tracker.

Basic usage

constcassandra=require('cassandra-driver');constclient=newcassandra.Client({contactPoints: ['h1','h2'],localDataCenter: 'datacenter1',keyspace: 'ks1'});constquery='SELECT name, email FROM users WHERE key = ?';client.execute(query,['someone']).then(result=>console.log('User with email %s',result.rows[0].email));

The driver supports both promises and callbacks for the asynchronous methods, you can choose the approach that suits your needs.

Note that in order to have concise code examples in this documentation, we will use the promise-based API of the driver along with the await keyword.

If you are using DataStax Astra you can configure your client by setting the secure bundle and the user credentials:

constclient=newcassandra.Client({cloud: {secureConnectBundle: 'path/to/secure-connect-DATABASE_NAME.zip'},credentials: {username: 'user_name',password: 'p@ssword1'}});

Prepare your queries

Using prepared statements provides multiple benefits.

Prepared statements are parsed and prepared on the Cassandra nodes and are ready for future execution. Also, when preparing, the driver retrieves information about the parameter types which allows an accurate mapping between a JavaScript type and a Cassandra type.

The driver will prepare the query once on each host and execute the statement with the bound parameters.

// Use query markers (?) and parametersconstquery='UPDATE users SET birth = ? WHERE key=?';constparams=[newDate(1942,10,1),'jimi-hendrix'];// Set the prepare flag in the query optionsawaitclient.execute(query,params,{prepare: true});console.log('Row updated on the cluster');

Row streaming and pipes

When using #eachRow() and #stream() methods, the driver parses each row as soon as it is received, yielding rows without buffering them.

// Reducing a large resultclient.eachRow('SELECT time, val FROM temperature WHERE station_id=',['abc'],(n,row)=>{// The callback will be invoked per each row as soon as they are receivedminTemperature=Math.min(row.val,minTemperature);},err=>{// This function will be invoked when all rows where consumed or an error was encountered });

The #stream() method works in the same way but instead of callback it returns a Readable Streams2 object in objectMode that emits instances of Row.

It can be piped downstream and provides automatic pause/resume logic (it buffers when not read).

client.stream('SELECT time, val FROM temperature WHERE station_id=',['abc']).on('readable',function(){// 'readable' is emitted as soon a row is received and parsedletrow;while(row=this.read()){console.log('time %s and value %s',row.time,row.val);}}).on('end',function(){// Stream ended, there aren't any more rows}).on('error',function(err){// Something went wrong: err is a response error from Cassandra});

User defined types

User defined types (UDT) are represented as JavaScript objects.

For example: Consider the following UDT and table

CREATETYPE address (
street text,
city text,
state text,
zip int,
phones set<text>
);
CREATETABLE users (
name textPRIMARYKEY,
email text,
address frozen<address>
);

You can retrieve the user address details as a regular JavaScript object.

constquery='SELECT name, address FROM users WHERE key = ?';constresult=awaitclient.execute(query,[key],{prepare: true});constrow=result.first();constaddress=row.address;console.log('User lives in %s, %s - %s',address.street,address.city,address.state);

Read more information about using UDTs with the Node.js Driver.

Paging

All driver methods use a default fetchSize of 5000 rows, retrieving only first page of results up to a maximum of 5000 rows to shield an application against accidentally retrieving large result sets in a single response.

stream() method automatically fetches the following page once the current one was read. You can also use eachRow() method to retrieve the following pages by using autoPage flag. See [paging documentation for more information][doc-paging].

Batch multiple statements

You can execute multiple statements in a batch to update/insert several rows atomically even in different column families.

constqueries=[{query: 'UPDATE user_profiles SET email=? WHERE key=?',params: [emailAddress,'hendrix']},{query: 'INSERT INTO user_track (key, text, date) VALUES (?, ?, ?)',params: ['hendrix','Changed email',newDate()]}];awaitclient.batch(queries,{prepare: true});console.log('Data updated on cluster');

Object Mapper

The driver provides a built-in object mapper that lets you interact with your data like you would interact with a set of documents.

Retrieving objects from the database:

constvideos=awaitvideoMapper.find({ userId });for(letvideoofvideos){console.log(video.name);}

Updating an object from the database:

awaitvideoMapper.update({ id, userId, name, addedDate, description });

You can read more information about getting started with the Mapper in our documentation.


Data types

There are few data types defined in the ECMAScript specification, this usually represents a problem when you are trying to deal with data types that come from other systems in JavaScript.

The driver supports all the CQL data types in Apache Cassandra (3.0 and below) even for types with no built-in JavaScript representation, like decimal, varint and bigint. Check the documentation on working with numerical values, uuids and collections.

Logging

Instances of Client() are EventEmitter and emit log events:

client.on('log',(level,loggerName,message,furtherInfo)=>{console.log(`${level} - ${loggerName}: ${message}`);});

The level being passed to the listener can be verbose, info, warning or error. Visit the logging documentation for more information.

Compatibility

  • Apache Cassandra versions 2.1 and above.
  • DataStax Enterprise versions 4.8 and above.
  • Node.js versions 8 and above.

Note: DataStax products do not support big-endian systems.

Credits

This driver is based on the original work of Jorge Bay on node-cassandra-cql and adds a series of advanced features that are common across all other DataStax drivers for Apache Cassandra.

The development effort to provide an up to date, high performance, fully featured Node.js Driver for Apache Cassandra will continue on this project, while node-cassandra-cql will be discontinued.

License

© DataStax, Inc.

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

About

DataStax Node.js Driver for Apache Cassandra

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

DataStax Node.js Driver for Apache Cassandra®

A modern, feature-rich and highly tunable Node.js client library for Apache Cassandra and DSE using exclusively Cassandra's binary protocol and Cassandra Query Language.

Installation

$ npm install cassandra-driver

Build StatusBuild status

Features

Documentation

Getting Help

You can use the project mailing list or create a ticket on the Jira issue tracker.

Basic usage

constcassandra=require('cassandra-driver');constclient=newcassandra.Client({contactPoints: ['h1','h2'],localDataCenter: 'datacenter1',keyspace: 'ks1'});constquery='SELECT name, email FROM users WHERE key = ?';client.execute(query,['someone']).then(result=>console.log('User with email %s',result.rows[0].email));

The driver supports both promises and callbacks for the asynchronous methods, you can choose the approach that suits your needs.

Note that in order to have concise code examples in this documentation, we will use the promise-based API of the driver along with the await keyword.

If you are using DataStax Astra you can configure your client by setting the secure bundle and the user credentials:

constclient=newcassandra.Client({cloud: {secureConnectBundle: 'path/to/secure-connect-DATABASE_NAME.zip'},credentials: {username: 'user_name',password: 'p@ssword1'}});

Prepare your queries

Using prepared statements provides multiple benefits.

Prepared statements are parsed and prepared on the Cassandra nodes and are ready for future execution. Also, when preparing, the driver retrieves information about the parameter types which allows an accurate mapping between a JavaScript type and a Cassandra type.

The driver will prepare the query once on each host and execute the statement with the bound parameters.

// Use query markers (?) and parametersconstquery='UPDATE users SET birth = ? WHERE key=?';constparams=[newDate(1942,10,1),'jimi-hendrix'];// Set the prepare flag in the query optionsawaitclient.execute(query,params,{prepare: true});console.log('Row updated on the cluster');

Row streaming and pipes

When using #eachRow() and #stream() methods, the driver parses each row as soon as it is received, yielding rows without buffering them.

// Reducing a large resultclient.eachRow('SELECT time, val FROM temperature WHERE station_id=',['abc'],(n,row)=>{// The callback will be invoked per each row as soon as they are receivedminTemperature=Math.min(row.val,minTemperature);},err=>{// This function will be invoked when all rows where consumed or an error was encountered });

The #stream() method works in the same way but instead of callback it returns a Readable Streams2 object in objectMode that emits instances of Row.

It can be piped downstream and provides automatic pause/resume logic (it buffers when not read).

client.stream('SELECT time, val FROM temperature WHERE station_id=',['abc']).on('readable',function(){// 'readable' is emitted as soon a row is received and parsedletrow;while(row=this.read()){console.log('time %s and value %s',row.time,row.val);}}).on('end',function(){// Stream ended, there aren't any more rows}).on('error',function(err){// Something went wrong: err is a response error from Cassandra});

User defined types

User defined types (UDT) are represented as JavaScript objects.

For example: Consider the following UDT and table

CREATETYPE address (
street text,
city text,
state text,
zip int,
phones set<text>
);
CREATETABLE users (
name textPRIMARYKEY,
email text,
address frozen<address>
);

You can retrieve the user address details as a regular JavaScript object.

constquery='SELECT name, address FROM users WHERE key = ?';constresult=awaitclient.execute(query,[key],{prepare: true});constrow=result.first();constaddress=row.address;console.log('User lives in %s, %s - %s',address.street,address.city,address.state);

Read more information about using UDTs with the Node.js Driver.

Paging

All driver methods use a default fetchSize of 5000 rows, retrieving only first page of results up to a maximum of 5000 rows to shield an application against accidentally retrieving large result sets in a single response.

stream() method automatically fetches the following page once the current one was read. You can also use eachRow() method to retrieve the following pages by using autoPage flag. See [paging documentation for more information][doc-paging].

Batch multiple statements

You can execute multiple statements in a batch to update/insert several rows atomically even in different column families.

constqueries=[{query: 'UPDATE user_profiles SET email=? WHERE key=?',params: [emailAddress,'hendrix']},{query: 'INSERT INTO user_track (key, text, date) VALUES (?, ?, ?)',params: ['hendrix','Changed email',newDate()]}];awaitclient.batch(queries,{prepare: true});console.log('Data updated on cluster');

Object Mapper

The driver provides a built-in object mapper that lets you interact with your data like you would interact with a set of documents.

Retrieving objects from the database:

constvideos=awaitvideoMapper.find({ userId });for(letvideoofvideos){console.log(video.name);}

Updating an object from the database:

awaitvideoMapper.update({ id, userId, name, addedDate, description });

You can read more information about getting started with the Mapper in our documentation.


Data types

There are few data types defined in the ECMAScript specification, this usually represents a problem when you are trying to deal with data types that come from other systems in JavaScript.

The driver supports all the CQL data types in Apache Cassandra (3.0 and below) even for types with no built-in JavaScript representation, like decimal, varint and bigint. Check the documentation on working with numerical values, uuids and collections.

Logging

Instances of Client() are EventEmitter and emit log events:

client.on('log',(level,loggerName,message,furtherInfo)=>{console.log(`${level} - ${loggerName}: ${message}`);});

The level being passed to the listener can be verbose, info, warning or error. Visit the logging documentation for more information.

Compatibility

  • Apache Cassandra versions 2.1 and above.
  • DataStax Enterprise versions 4.8 and above.
  • Node.js versions 8 and above.

Note: DataStax products do not support big-endian systems.

Credits

This driver is based on the original work of Jorge Bay on node-cassandra-cql and adds a series of advanced features that are common across all other DataStax drivers for Apache Cassandra.

The development effort to provide an up to date, high performance, fully featured Node.js Driver for Apache Cassandra will continue on this project, while node-cassandra-cql will be discontinued.

License

© DataStax, Inc.

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

About

DataStax Node.js Driver for Apache Cassandra

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

DataStax Node.js Driver for Apache Cassandra®

A modern, feature-rich and highly tunable Node.js client library for Apache Cassandra and DSE using exclusively Cassandra's binary protocol and Cassandra Query Language.

Installation

$ npm install cassandra-driver

Build StatusBuild status

Features

Documentation

Getting Help

You can use the project mailing list or create a ticket on the Jira issue tracker.

Basic usage

constcassandra=require('cassandra-driver');constclient=newcassandra.Client({contactPoints: ['h1','h2'],localDataCenter: 'datacenter1',keyspace: 'ks1'});constquery='SELECT name, email FROM users WHERE key = ?';client.execute(query,['someone']).then(result=>console.log('User with email %s',result.rows[0].email));

The driver supports both promises and callbacks for the asynchronous methods, you can choose the approach that suits your needs.

Note that in order to have concise code examples in this documentation, we will use the promise-based API of the driver along with the await keyword.

If you are using DataStax Astra you can configure your client by setting the secure bundle and the user credentials:

constclient=newcassandra.Client({cloud: {secureConnectBundle: 'path/to/secure-connect-DATABASE_NAME.zip'},credentials: {username: 'user_name',password: 'p@ssword1'}});

Prepare your queries

Using prepared statements provides multiple benefits.

Prepared statements are parsed and prepared on the Cassandra nodes and are ready for future execution. Also, when preparing, the driver retrieves information about the parameter types which allows an accurate mapping between a JavaScript type and a Cassandra type.

The driver will prepare the query once on each host and execute the statement with the bound parameters.

// Use query markers (?) and parametersconstquery='UPDATE users SET birth = ? WHERE key=?';constparams=[newDate(1942,10,1),'jimi-hendrix'];// Set the prepare flag in the query optionsawaitclient.execute(query,params,{prepare: true});console.log('Row updated on the cluster');

Row streaming and pipes

When using #eachRow() and #stream() methods, the driver parses each row as soon as it is received, yielding rows without buffering them.

// Reducing a large resultclient.eachRow('SELECT time, val FROM temperature WHERE station_id=',['abc'],(n,row)=>{// The callback will be invoked per each row as soon as they are receivedminTemperature=Math.min(row.val,minTemperature);},err=>{// This function will be invoked when all rows where consumed or an error was encountered });

The #stream() method works in the same way but instead of callback it returns a Readable Streams2 object in objectMode that emits instances of Row.

It can be piped downstream and provides automatic pause/resume logic (it buffers when not read).

client.stream('SELECT time, val FROM temperature WHERE station_id=',['abc']).on('readable',function(){// 'readable' is emitted as soon a row is received and parsedletrow;while(row=this.read()){console.log('time %s and value %s',row.time,row.val);}}).on('end',function(){// Stream ended, there aren't any more rows}).on('error',function(err){// Something went wrong: err is a response error from Cassandra});

User defined types

User defined types (UDT) are represented as JavaScript objects.

For example: Consider the following UDT and table

CREATETYPE address (
street text,
city text,
state text,
zip int,
phones set<text>
);
CREATETABLE users (
name textPRIMARYKEY,
email text,
address frozen<address>
);

You can retrieve the user address details as a regular JavaScript object.

constquery='SELECT name, address FROM users WHERE key = ?';constresult=awaitclient.execute(query,[key],{prepare: true});constrow=result.first();constaddress=row.address;console.log('User lives in %s, %s - %s',address.street,address.city,address.state);

Read more information about using UDTs with the Node.js Driver.

Paging

All driver methods use a default fetchSize of 5000 rows, retrieving only first page of results up to a maximum of 5000 rows to shield an application against accidentally retrieving large result sets in a single response.

stream() method automatically fetches the following page once the current one was read. You can also use eachRow() method to retrieve the following pages by using autoPage flag. See [paging documentation for more information][doc-paging].

Batch multiple statements

You can execute multiple statements in a batch to update/insert several rows atomically even in different column families.

constqueries=[{query: 'UPDATE user_profiles SET email=? WHERE key=?',params: [emailAddress,'hendrix']},{query: 'INSERT INTO user_track (key, text, date) VALUES (?, ?, ?)',params: ['hendrix','Changed email',newDate()]}];awaitclient.batch(queries,{prepare: true});console.log('Data updated on cluster');

Object Mapper

The driver provides a built-in object mapper that lets you interact with your data like you would interact with a set of documents.

Retrieving objects from the database:

constvideos=awaitvideoMapper.find({ userId });for(letvideoofvideos){console.log(video.name);}

Updating an object from the database:

awaitvideoMapper.update({ id, userId, name, addedDate, description });

You can read more information about getting started with the Mapper in our documentation.


Data types

There are few data types defined in the ECMAScript specification, this usually represents a problem when you are trying to deal with data types that come from other systems in JavaScript.

The driver supports all the CQL data types in Apache Cassandra (3.0 and below) even for types with no built-in JavaScript representation, like decimal, varint and bigint. Check the documentation on working with numerical values, uuids and collections.

Logging

Instances of Client() are EventEmitter and emit log events:

client.on('log',(level,loggerName,message,furtherInfo)=>{console.log(`${level} - ${loggerName}: ${message}`);});

The level being passed to the listener can be verbose, info, warning or error. Visit the logging documentation for more information.

Compatibility

  • Apache Cassandra versions 2.1 and above.
  • DataStax Enterprise versions 4.8 and above.
  • Node.js versions 8 and above.

Note: DataStax products do not support big-endian systems.

Credits

This driver is based on the original work of Jorge Bay on node-cassandra-cql and adds a series of advanced features that are common across all other DataStax drivers for Apache Cassandra.

The development effort to provide an up to date, high performance, fully featured Node.js Driver for Apache Cassandra will continue on this project, while node-cassandra-cql will be discontinued.

License

© DataStax, Inc.

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

About

DataStax Node.js Driver for Apache Cassandra

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

DataStax Node.js Driver for Apache Cassandra®

A modern, feature-rich and highly tunable Node.js client library for Apache Cassandra and DSE using exclusively Cassandra's binary protocol and Cassandra Query Language.

Installation

$ npm install cassandra-driver

Build StatusBuild status

Features

Documentation

Getting Help

You can use the project mailing list or create a ticket on the Jira issue tracker.

Basic usage

constcassandra=require('cassandra-driver');constclient=newcassandra.Client({contactPoints: ['h1','h2'],localDataCenter: 'datacenter1',keyspace: 'ks1'});constquery='SELECT name, email FROM users WHERE key = ?';client.execute(query,['someone']).then(result=>console.log('User with email %s',result.rows[0].email));

The driver supports both promises and callbacks for the asynchronous methods, you can choose the approach that suits your needs.

Note that in order to have concise code examples in this documentation, we will use the promise-based API of the driver along with the await keyword.

If you are using DataStax Astra you can configure your client by setting the secure bundle and the user credentials:

constclient=newcassandra.Client({cloud: {secureConnectBundle: 'path/to/secure-connect-DATABASE_NAME.zip'},credentials: {username: 'user_name',password: 'p@ssword1'}});

Prepare your queries

Using prepared statements provides multiple benefits.

Prepared statements are parsed and prepared on the Cassandra nodes and are ready for future execution. Also, when preparing, the driver retrieves information about the parameter types which allows an accurate mapping between a JavaScript type and a Cassandra type.

The driver will prepare the query once on each host and execute the statement with the bound parameters.

// Use query markers (?) and parametersconstquery='UPDATE users SET birth = ? WHERE key=?';constparams=[newDate(1942,10,1),'jimi-hendrix'];// Set the prepare flag in the query optionsawaitclient.execute(query,params,{prepare: true});console.log('Row updated on the cluster');

Row streaming and pipes

When using #eachRow() and #stream() methods, the driver parses each row as soon as it is received, yielding rows without buffering them.

// Reducing a large resultclient.eachRow('SELECT time, val FROM temperature WHERE station_id=',['abc'],(n,row)=>{// The callback will be invoked per each row as soon as they are receivedminTemperature=Math.min(row.val,minTemperature);},err=>{// This function will be invoked when all rows where consumed or an error was encountered });

The #stream() method works in the same way but instead of callback it returns a Readable Streams2 object in objectMode that emits instances of Row.

It can be piped downstream and provides automatic pause/resume logic (it buffers when not read).

client.stream('SELECT time, val FROM temperature WHERE station_id=',['abc']).on('readable',function(){// 'readable' is emitted as soon a row is received and parsedletrow;while(row=this.read()){console.log('time %s and value %s',row.time,row.val);}}).on('end',function(){// Stream ended, there aren't any more rows}).on('error',function(err){// Something went wrong: err is a response error from Cassandra});

User defined types

User defined types (UDT) are represented as JavaScript objects.

For example: Consider the following UDT and table

CREATETYPE address (
street text,
city text,
state text,
zip int,
phones set<text>
);
CREATETABLE users (
name textPRIMARYKEY,
email text,
address frozen<address>
);

You can retrieve the user address details as a regular JavaScript object.

constquery='SELECT name, address FROM users WHERE key = ?';constresult=awaitclient.execute(query,[key],{prepare: true});constrow=result.first();constaddress=row.address;console.log('User lives in %s, %s - %s',address.street,address.city,address.state);

Read more information about using UDTs with the Node.js Driver.

Paging

All driver methods use a default fetchSize of 5000 rows, retrieving only first page of results up to a maximum of 5000 rows to shield an application against accidentally retrieving large result sets in a single response.

stream() method automatically fetches the following page once the current one was read. You can also use eachRow() method to retrieve the following pages by using autoPage flag. See [paging documentation for more information][doc-paging].

Batch multiple statements

You can execute multiple statements in a batch to update/insert several rows atomically even in different column families.

constqueries=[{query: 'UPDATE user_profiles SET email=? WHERE key=?',params: [emailAddress,'hendrix']},{query: 'INSERT INTO user_track (key, text, date) VALUES (?, ?, ?)',params: ['hendrix','Changed email',newDate()]}];awaitclient.batch(queries,{prepare: true});console.log('Data updated on cluster');

Object Mapper

The driver provides a built-in object mapper that lets you interact with your data like you would interact with a set of documents.

Retrieving objects from the database:

constvideos=awaitvideoMapper.find({ userId });for(letvideoofvideos){console.log(video.name);}

Updating an object from the database:

awaitvideoMapper.update({ id, userId, name, addedDate, description });

You can read more information about getting started with the Mapper in our documentation.


Data types

There are few data types defined in the ECMAScript specification, this usually represents a problem when you are trying to deal with data types that come from other systems in JavaScript.

The driver supports all the CQL data types in Apache Cassandra (3.0 and below) even for types with no built-in JavaScript representation, like decimal, varint and bigint. Check the documentation on working with numerical values, uuids and collections.

Logging

Instances of Client() are EventEmitter and emit log events:

client.on('log',(level,loggerName,message,furtherInfo)=>{console.log(`${level} - ${loggerName}: ${message}`);});

The level being passed to the listener can be verbose, info, warning or error. Visit the logging documentation for more information.

Compatibility

  • Apache Cassandra versions 2.1 and above.
  • DataStax Enterprise versions 4.8 and above.
  • Node.js versions 8 and above.

Note: DataStax products do not support big-endian systems.

Credits

This driver is based on the original work of Jorge Bay on node-cassandra-cql and adds a series of advanced features that are common across all other DataStax drivers for Apache Cassandra.

The development effort to provide an up to date, high performance, fully featured Node.js Driver for Apache Cassandra will continue on this project, while node-cassandra-cql will be discontinued.

License

© DataStax, Inc.

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

About

DataStax Node.js Driver for Apache Cassandra

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

DataStax Node.js Driver for Apache Cassandra®

A modern, feature-rich and highly tunable Node.js client library for Apache Cassandra and DSE using exclusively Cassandra's binary protocol and Cassandra Query Language.

Installation

$ npm install cassandra-driver

Build StatusBuild status

Features

Documentation

Getting Help

You can use the project mailing list or create a ticket on the Jira issue tracker.

Basic usage

constcassandra=require('cassandra-driver');constclient=newcassandra.Client({contactPoints: ['h1','h2'],localDataCenter: 'datacenter1',keyspace: 'ks1'});constquery='SELECT name, email FROM users WHERE key = ?';client.execute(query,['someone']).then(result=>console.log('User with email %s',result.rows[0].email));

The driver supports both promises and callbacks for the asynchronous methods, you can choose the approach that suits your needs.

Note that in order to have concise code examples in this documentation, we will use the promise-based API of the driver along with the await keyword.

If you are using DataStax Astra you can configure your client by setting the secure bundle and the user credentials:

constclient=newcassandra.Client({cloud: {secureConnectBundle: 'path/to/secure-connect-DATABASE_NAME.zip'},credentials: {username: 'user_name',password: 'p@ssword1'}});

Prepare your queries

Using prepared statements provides multiple benefits.

Prepared statements are parsed and prepared on the Cassandra nodes and are ready for future execution. Also, when preparing, the driver retrieves information about the parameter types which allows an accurate mapping between a JavaScript type and a Cassandra type.

The driver will prepare the query once on each host and execute the statement with the bound parameters.

// Use query markers (?) and parametersconstquery='UPDATE users SET birth = ? WHERE key=?';constparams=[newDate(1942,10,1),'jimi-hendrix'];// Set the prepare flag in the query optionsawaitclient.execute(query,params,{prepare: true});console.log('Row updated on the cluster');

Row streaming and pipes

When using #eachRow() and #stream() methods, the driver parses each row as soon as it is received, yielding rows without buffering them.

// Reducing a large resultclient.eachRow('SELECT time, val FROM temperature WHERE station_id=',['abc'],(n,row)=>{// The callback will be invoked per each row as soon as they are receivedminTemperature=Math.min(row.val,minTemperature);},err=>{// This function will be invoked when all rows where consumed or an error was encountered });

The #stream() method works in the same way but instead of callback it returns a Readable Streams2 object in objectMode that emits instances of Row.

It can be piped downstream and provides automatic pause/resume logic (it buffers when not read).

client.stream('SELECT time, val FROM temperature WHERE station_id=',['abc']).on('readable',function(){// 'readable' is emitted as soon a row is received and parsedletrow;while(row=this.read()){console.log('time %s and value %s',row.time,row.val);}}).on('end',function(){// Stream ended, there aren't any more rows}).on('error',function(err){// Something went wrong: err is a response error from Cassandra});

User defined types

User defined types (UDT) are represented as JavaScript objects.

For example: Consider the following UDT and table

CREATETYPE address (
street text,
city text,
state text,
zip int,
phones set<text>
);
CREATETABLE users (
name textPRIMARYKEY,
email text,
address frozen<address>
);

You can retrieve the user address details as a regular JavaScript object.

constquery='SELECT name, address FROM users WHERE key = ?';constresult=awaitclient.execute(query,[key],{prepare: true});constrow=result.first();constaddress=row.address;console.log('User lives in %s, %s - %s',address.street,address.city,address.state);

Read more information about using UDTs with the Node.js Driver.

Paging

All driver methods use a default fetchSize of 5000 rows, retrieving only first page of results up to a maximum of 5000 rows to shield an application against accidentally retrieving large result sets in a single response.

stream() method automatically fetches the following page once the current one was read. You can also use eachRow() method to retrieve the following pages by using autoPage flag. See [paging documentation for more information][doc-paging].

Batch multiple statements

You can execute multiple statements in a batch to update/insert several rows atomically even in different column families.

constqueries=[{query: 'UPDATE user_profiles SET email=? WHERE key=?',params: [emailAddress,'hendrix']},{query: 'INSERT INTO user_track (key, text, date) VALUES (?, ?, ?)',params: ['hendrix','Changed email',newDate()]}];awaitclient.batch(queries,{prepare: true});console.log('Data updated on cluster');

Object Mapper

The driver provides a built-in object mapper that lets you interact with your data like you would interact with a set of documents.

Retrieving objects from the database:

constvideos=awaitvideoMapper.find({ userId });for(letvideoofvideos){console.log(video.name);}

Updating an object from the database:

awaitvideoMapper.update({ id, userId, name, addedDate, description });

You can read more information about getting started with the Mapper in our documentation.


Data types

There are few data types defined in the ECMAScript specification, this usually represents a problem when you are trying to deal with data types that come from other systems in JavaScript.

The driver supports all the CQL data types in Apache Cassandra (3.0 and below) even for types with no built-in JavaScript representation, like decimal, varint and bigint. Check the documentation on working with numerical values, uuids and collections.

Logging

Instances of Client() are EventEmitter and emit log events:

client.on('log',(level,loggerName,message,furtherInfo)=>{console.log(`${level} - ${loggerName}: ${message}`);});

The level being passed to the listener can be verbose, info, warning or error. Visit the logging documentation for more information.

Compatibility

  • Apache Cassandra versions 2.1 and above.
  • DataStax Enterprise versions 4.8 and above.
  • Node.js versions 8 and above.

Note: DataStax products do not support big-endian systems.

Credits

This driver is based on the original work of Jorge Bay on node-cassandra-cql and adds a series of advanced features that are common across all other DataStax drivers for Apache Cassandra.

The development effort to provide an up to date, high performance, fully featured Node.js Driver for Apache Cassandra will continue on this project, while node-cassandra-cql will be discontinued.

License

© DataStax, Inc.

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

About

DataStax Node.js Driver for Apache Cassandra

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

DataStax Node.js Driver for Apache Cassandra®

A modern, feature-rich and highly tunable Node.js client library for Apache Cassandra and DSE using exclusively Cassandra's binary protocol and Cassandra Query Language.

Installation

$ npm install cassandra-driver

Build StatusBuild status

Features

Documentation

Getting Help

You can use the project mailing list or create a ticket on the Jira issue tracker.

Basic usage

constcassandra=require('cassandra-driver');constclient=newcassandra.Client({contactPoints: ['h1','h2'],localDataCenter: 'datacenter1',keyspace: 'ks1'});constquery='SELECT name, email FROM users WHERE key = ?';client.execute(query,['someone']).then(result=>console.log('User with email %s',result.rows[0].email));

The driver supports both promises and callbacks for the asynchronous methods, you can choose the approach that suits your needs.

Note that in order to have concise code examples in this documentation, we will use the promise-based API of the driver along with the await keyword.

If you are using DataStax Astra you can configure your client by setting the secure bundle and the user credentials:

constclient=newcassandra.Client({cloud: {secureConnectBundle: 'path/to/secure-connect-DATABASE_NAME.zip'},credentials: {username: 'user_name',password: 'p@ssword1'}});

Prepare your queries

Using prepared statements provides multiple benefits.

Prepared statements are parsed and prepared on the Cassandra nodes and are ready for future execution. Also, when preparing, the driver retrieves information about the parameter types which allows an accurate mapping between a JavaScript type and a Cassandra type.

The driver will prepare the query once on each host and execute the statement with the bound parameters.

// Use query markers (?) and parametersconstquery='UPDATE users SET birth = ? WHERE key=?';constparams=[newDate(1942,10,1),'jimi-hendrix'];// Set the prepare flag in the query optionsawaitclient.execute(query,params,{prepare: true});console.log('Row updated on the cluster');

Row streaming and pipes

When using #eachRow() and #stream() methods, the driver parses each row as soon as it is received, yielding rows without buffering them.

// Reducing a large resultclient.eachRow('SELECT time, val FROM temperature WHERE station_id=',['abc'],(n,row)=>{// The callback will be invoked per each row as soon as they are receivedminTemperature=Math.min(row.val,minTemperature);},err=>{// This function will be invoked when all rows where consumed or an error was encountered });

The #stream() method works in the same way but instead of callback it returns a Readable Streams2 object in objectMode that emits instances of Row.

It can be piped downstream and provides automatic pause/resume logic (it buffers when not read).

client.stream('SELECT time, val FROM temperature WHERE station_id=',['abc']).on('readable',function(){// 'readable' is emitted as soon a row is received and parsedletrow;while(row=this.read()){console.log('time %s and value %s',row.time,row.val);}}).on('end',function(){// Stream ended, there aren't any more rows}).on('error',function(err){// Something went wrong: err is a response error from Cassandra});

User defined types

User defined types (UDT) are represented as JavaScript objects.

For example: Consider the following UDT and table

CREATETYPE address (
street text,
city text,
state text,
zip int,
phones set<text>
);
CREATETABLE users (
name textPRIMARYKEY,
email text,
address frozen<address>
);

You can retrieve the user address details as a regular JavaScript object.

constquery='SELECT name, address FROM users WHERE key = ?';constresult=awaitclient.execute(query,[key],{prepare: true});constrow=result.first();constaddress=row.address;console.log('User lives in %s, %s - %s',address.street,address.city,address.state);

Read more information about using UDTs with the Node.js Driver.

Paging

All driver methods use a default fetchSize of 5000 rows, retrieving only first page of results up to a maximum of 5000 rows to shield an application against accidentally retrieving large result sets in a single response.

stream() method automatically fetches the following page once the current one was read. You can also use eachRow() method to retrieve the following pages by using autoPage flag. See [paging documentation for more information][doc-paging].

Batch multiple statements

You can execute multiple statements in a batch to update/insert several rows atomically even in different column families.

constqueries=[{query: 'UPDATE user_profiles SET email=? WHERE key=?',params: [emailAddress,'hendrix']},{query: 'INSERT INTO user_track (key, text, date) VALUES (?, ?, ?)',params: ['hendrix','Changed email',newDate()]}];awaitclient.batch(queries,{prepare: true});console.log('Data updated on cluster');

Object Mapper

The driver provides a built-in object mapper that lets you interact with your data like you would interact with a set of documents.

Retrieving objects from the database:

constvideos=awaitvideoMapper.find({ userId });for(letvideoofvideos){console.log(video.name);}

Updating an object from the database:

awaitvideoMapper.update({ id, userId, name, addedDate, description });

You can read more information about getting started with the Mapper in our documentation.


Data types

There are few data types defined in the ECMAScript specification, this usually represents a problem when you are trying to deal with data types that come from other systems in JavaScript.

The driver supports all the CQL data types in Apache Cassandra (3.0 and below) even for types with no built-in JavaScript representation, like decimal, varint and bigint. Check the documentation on working with numerical values, uuids and collections.

Logging

Instances of Client() are EventEmitter and emit log events:

client.on('log',(level,loggerName,message,furtherInfo)=>{console.log(`${level} - ${loggerName}: ${message}`);});

The level being passed to the listener can be verbose, info, warning or error. Visit the logging documentation for more information.

Compatibility

  • Apache Cassandra versions 2.1 and above.
  • DataStax Enterprise versions 4.8 and above.
  • Node.js versions 8 and above.

Note: DataStax products do not support big-endian systems.

Credits

This driver is based on the original work of Jorge Bay on node-cassandra-cql and adds a series of advanced features that are common across all other DataStax drivers for Apache Cassandra.

The development effort to provide an up to date, high performance, fully featured Node.js Driver for Apache Cassandra will continue on this project, while node-cassandra-cql will be discontinued.

License

© DataStax, Inc.

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

About

DataStax Node.js Driver for Apache Cassandra

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

DataStax Node.js Driver for Apache Cassandra®

A modern, feature-rich and highly tunable Node.js client library for Apache Cassandra and DSE using exclusively Cassandra's binary protocol and Cassandra Query Language.

Installation

$ npm install cassandra-driver

Build StatusBuild status

Features

Documentation

Getting Help

You can use the project mailing list or create a ticket on the Jira issue tracker.

Basic usage

constcassandra=require('cassandra-driver');constclient=newcassandra.Client({contactPoints: ['h1','h2'],localDataCenter: 'datacenter1',keyspace: 'ks1'});constquery='SELECT name, email FROM users WHERE key = ?';client.execute(query,['someone']).then(result=>console.log('User with email %s',result.rows[0].email));

The driver supports both promises and callbacks for the asynchronous methods, you can choose the approach that suits your needs.

Note that in order to have concise code examples in this documentation, we will use the promise-based API of the driver along with the await keyword.

If you are using DataStax Astra you can configure your client by setting the secure bundle and the user credentials:

constclient=newcassandra.Client({cloud: {secureConnectBundle: 'path/to/secure-connect-DATABASE_NAME.zip'},credentials: {username: 'user_name',password: 'p@ssword1'}});

Prepare your queries

Using prepared statements provides multiple benefits.

Prepared statements are parsed and prepared on the Cassandra nodes and are ready for future execution. Also, when preparing, the driver retrieves information about the parameter types which allows an accurate mapping between a JavaScript type and a Cassandra type.

The driver will prepare the query once on each host and execute the statement with the bound parameters.

// Use query markers (?) and parametersconstquery='UPDATE users SET birth = ? WHERE key=?';constparams=[newDate(1942,10,1),'jimi-hendrix'];// Set the prepare flag in the query optionsawaitclient.execute(query,params,{prepare: true});console.log('Row updated on the cluster');

Row streaming and pipes

When using #eachRow() and #stream() methods, the driver parses each row as soon as it is received, yielding rows without buffering them.

// Reducing a large resultclient.eachRow('SELECT time, val FROM temperature WHERE station_id=',['abc'],(n,row)=>{// The callback will be invoked per each row as soon as they are receivedminTemperature=Math.min(row.val,minTemperature);},err=>{// This function will be invoked when all rows where consumed or an error was encountered });

The #stream() method works in the same way but instead of callback it returns a Readable Streams2 object in objectMode that emits instances of Row.

It can be piped downstream and provides automatic pause/resume logic (it buffers when not read).

client.stream('SELECT time, val FROM temperature WHERE station_id=',['abc']).on('readable',function(){// 'readable' is emitted as soon a row is received and parsedletrow;while(row=this.read()){console.log('time %s and value %s',row.time,row.val);}}).on('end',function(){// Stream ended, there aren't any more rows}).on('error',function(err){// Something went wrong: err is a response error from Cassandra});

User defined types

User defined types (UDT) are represented as JavaScript objects.

For example: Consider the following UDT and table

CREATETYPE address (
street text,
city text,
state text,
zip int,
phones set<text>
);
CREATETABLE users (
name textPRIMARYKEY,
email text,
address frozen<address>
);

You can retrieve the user address details as a regular JavaScript object.

constquery='SELECT name, address FROM users WHERE key = ?';constresult=awaitclient.execute(query,[key],{prepare: true});constrow=result.first();constaddress=row.address;console.log('User lives in %s, %s - %s',address.street,address.city,address.state);

Read more information about using UDTs with the Node.js Driver.

Paging

All driver methods use a default fetchSize of 5000 rows, retrieving only first page of results up to a maximum of 5000 rows to shield an application against accidentally retrieving large result sets in a single response.

stream() method automatically fetches the following page once the current one was read. You can also use eachRow() method to retrieve the following pages by using autoPage flag. See [paging documentation for more information][doc-paging].

Batch multiple statements

You can execute multiple statements in a batch to update/insert several rows atomically even in different column families.

constqueries=[{query: 'UPDATE user_profiles SET email=? WHERE key=?',params: [emailAddress,'hendrix']},{query: 'INSERT INTO user_track (key, text, date) VALUES (?, ?, ?)',params: ['hendrix','Changed email',newDate()]}];awaitclient.batch(queries,{prepare: true});console.log('Data updated on cluster');

Object Mapper

The driver provides a built-in object mapper that lets you interact with your data like you would interact with a set of documents.

Retrieving objects from the database:

constvideos=awaitvideoMapper.find({ userId });for(letvideoofvideos){console.log(video.name);}

Updating an object from the database:

awaitvideoMapper.update({ id, userId, name, addedDate, description });

You can read more information about getting started with the Mapper in our documentation.


Data types

There are few data types defined in the ECMAScript specification, this usually represents a problem when you are trying to deal with data types that come from other systems in JavaScript.

The driver supports all the CQL data types in Apache Cassandra (3.0 and below) even for types with no built-in JavaScript representation, like decimal, varint and bigint. Check the documentation on working with numerical values, uuids and collections.

Logging

Instances of Client() are EventEmitter and emit log events:

client.on('log',(level,loggerName,message,furtherInfo)=>{console.log(`${level} - ${loggerName}: ${message}`);});

The level being passed to the listener can be verbose, info, warning or error. Visit the logging documentation for more information.

Compatibility

  • Apache Cassandra versions 2.1 and above.
  • DataStax Enterprise versions 4.8 and above.
  • Node.js versions 8 and above.

Note: DataStax products do not support big-endian systems.

Credits

This driver is based on the original work of Jorge Bay on node-cassandra-cql and adds a series of advanced features that are common across all other DataStax drivers for Apache Cassandra.

The development effort to provide an up to date, high performance, fully featured Node.js Driver for Apache Cassandra will continue on this project, while node-cassandra-cql will be discontinued.

License

© DataStax, Inc.

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

About

DataStax Node.js Driver for Apache Cassandra

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

DataStax Node.js Driver for Apache Cassandra®

A modern, feature-rich and highly tunable Node.js client library for Apache Cassandra and DSE using exclusively Cassandra's binary protocol and Cassandra Query Language.

Installation

$ npm install cassandra-driver

Build StatusBuild status

Features

Documentation

Getting Help

You can use the project mailing list or create a ticket on the Jira issue tracker.

Basic usage

constcassandra=require('cassandra-driver');constclient=newcassandra.Client({contactPoints: ['h1','h2'],localDataCenter: 'datacenter1',keyspace: 'ks1'});constquery='SELECT name, email FROM users WHERE key = ?';client.execute(query,['someone']).then(result=>console.log('User with email %s',result.rows[0].email));

The driver supports both promises and callbacks for the asynchronous methods, you can choose the approach that suits your needs.

Note that in order to have concise code examples in this documentation, we will use the promise-based API of the driver along with the await keyword.

If you are using DataStax Astra you can configure your client by setting the secure bundle and the user credentials:

constclient=newcassandra.Client({cloud: {secureConnectBundle: 'path/to/secure-connect-DATABASE_NAME.zip'},credentials: {username: 'user_name',password: 'p@ssword1'}});

Prepare your queries

Using prepared statements provides multiple benefits.

Prepared statements are parsed and prepared on the Cassandra nodes and are ready for future execution. Also, when preparing, the driver retrieves information about the parameter types which allows an accurate mapping between a JavaScript type and a Cassandra type.

The driver will prepare the query once on each host and execute the statement with the bound parameters.

// Use query markers (?) and parametersconstquery='UPDATE users SET birth = ? WHERE key=?';constparams=[newDate(1942,10,1),'jimi-hendrix'];// Set the prepare flag in the query optionsawaitclient.execute(query,params,{prepare: true});console.log('Row updated on the cluster');

Row streaming and pipes

When using #eachRow() and #stream() methods, the driver parses each row as soon as it is received, yielding rows without buffering them.

// Reducing a large resultclient.eachRow('SELECT time, val FROM temperature WHERE station_id=',['abc'],(n,row)=>{// The callback will be invoked per each row as soon as they are receivedminTemperature=Math.min(row.val,minTemperature);},err=>{// This function will be invoked when all rows where consumed or an error was encountered });

The #stream() method works in the same way but instead of callback it returns a Readable Streams2 object in objectMode that emits instances of Row.

It can be piped downstream and provides automatic pause/resume logic (it buffers when not read).

client.stream('SELECT time, val FROM temperature WHERE station_id=',['abc']).on('readable',function(){// 'readable' is emitted as soon a row is received and parsedletrow;while(row=this.read()){console.log('time %s and value %s',row.time,row.val);}}).on('end',function(){// Stream ended, there aren't any more rows}).on('error',function(err){// Something went wrong: err is a response error from Cassandra});

User defined types

User defined types (UDT) are represented as JavaScript objects.

For example: Consider the following UDT and table

CREATETYPE address (
street text,
city text,
state text,
zip int,
phones set<text>
);
CREATETABLE users (
name textPRIMARYKEY,
email text,
address frozen<address>
);

You can retrieve the user address details as a regular JavaScript object.

constquery='SELECT name, address FROM users WHERE key = ?';constresult=awaitclient.execute(query,[key],{prepare: true});constrow=result.first();constaddress=row.address;console.log('User lives in %s, %s - %s',address.street,address.city,address.state);

Read more information about using UDTs with the Node.js Driver.

Paging

All driver methods use a default fetchSize of 5000 rows, retrieving only first page of results up to a maximum of 5000 rows to shield an application against accidentally retrieving large result sets in a single response.

stream() method automatically fetches the following page once the current one was read. You can also use eachRow() method to retrieve the following pages by using autoPage flag. See [paging documentation for more information][doc-paging].

Batch multiple statements

You can execute multiple statements in a batch to update/insert several rows atomically even in different column families.

constqueries=[{query: 'UPDATE user_profiles SET email=? WHERE key=?',params: [emailAddress,'hendrix']},{query: 'INSERT INTO user_track (key, text, date) VALUES (?, ?, ?)',params: ['hendrix','Changed email',newDate()]}];awaitclient.batch(queries,{prepare: true});console.log('Data updated on cluster');

Object Mapper

The driver provides a built-in object mapper that lets you interact with your data like you would interact with a set of documents.

Retrieving objects from the database:

constvideos=awaitvideoMapper.find({ userId });for(letvideoofvideos){console.log(video.name);}

Updating an object from the database:

awaitvideoMapper.update({ id, userId, name, addedDate, description });

You can read more information about getting started with the Mapper in our documentation.


Data types

There are few data types defined in the ECMAScript specification, this usually represents a problem when you are trying to deal with data types that come from other systems in JavaScript.

The driver supports all the CQL data types in Apache Cassandra (3.0 and below) even for types with no built-in JavaScript representation, like decimal, varint and bigint. Check the documentation on working with numerical values, uuids and collections.

Logging

Instances of Client() are EventEmitter and emit log events:

client.on('log',(level,loggerName,message,furtherInfo)=>{console.log(`${level} - ${loggerName}: ${message}`);});

The level being passed to the listener can be verbose, info, warning or error. Visit the logging documentation for more information.

Compatibility

  • Apache Cassandra versions 2.1 and above.
  • DataStax Enterprise versions 4.8 and above.
  • Node.js versions 8 and above.

Note: DataStax products do not support big-endian systems.

Credits

This driver is based on the original work of Jorge Bay on node-cassandra-cql and adds a series of advanced features that are common across all other DataStax drivers for Apache Cassandra.

The development effort to provide an up to date, high performance, fully featured Node.js Driver for Apache Cassandra will continue on this project, while node-cassandra-cql will be discontinued.

License

© DataStax, Inc.

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

About

DataStax Node.js Driver for Apache Cassandra

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages