©2015 Couchbase Inc. 1
Nic Raboy, Developer Advocate at Couchbase
Quick and Easy Development with Node.js
and Couchbase Server
©2015 Couchbase Inc. 2
About Me
Nic Raboy
Developer Advocate at Couchbase
@nraboy (Twitter)
Node.js, Android, Java, Ionic Framework, NoSQL, SQL
©2015 Couchbase Inc. 3
What Is Couchbase?
©2015 Couchbase Inc. 4
What makes Couchbase unique?
4
Performance &
scalability leader
Sub millisecond latency
with high throughput;
memory-centric
architecture
Multi-
purpose
Simplified
administration
Easy to deploy &
manage; integrated
Admin Console, single-
click cluster expansion
& rebalance
Cache, key value store,
document database,
and local/mobile
database in single
platform
Always-on
availability
Data replication across
nodes, clusters, and
data centers
Enterprises choose Couchbase for several key advantages
24x365
©2015 Couchbase Inc. 5
 Consolidated cache and
database
 Tune memory required based
on application requirements
Multi-purpose database supports many uses
5
5
Tunable built-in
cache
Flexible schemas
with JSON
Couchbase Lite
 Represent data with varying
schemas using JSON on the
server or on the device
 Index and query data with
Javascript views
 Light weight embedded DB for
always available apps
 Sync Gateway syncs data
seamlessly with Couchbase
Server
©2015 Couchbase Inc. 6
Couchbase leads in performance and scalability
Auto
Sharding
Memory-memory
XDCR
Single
NodeType
 No manual sharding
 Database manages data
movement to scale out – not
the user
 Market’s only memory-to-
memory database replication
across clusters and geos
 Provides disaster recover /
data locality
 Hugely simplifies management
of clusters
 Easy to scale clusters by adding
any number of nodes
©2015 Couchbase Inc. 7
Available Couchbase Server SDKs
And more…
©2015 Couchbase Inc. 8
Overview of the Node.js SDK
©2015 Couchbase Inc. 9
Node.js SDK
 Uses the high performance Couchbase C library
 Compatible with Node.js frameworks
 Minimal coding
©2015 Couchbase Inc. 10
Node.js
// InstantiateThe Query API
var couchbase = require(“couchbase”);
var myCluster = new Couchbase.Cluster(“localhost:8091”);
var myBucket = myCluster.openBucket(“travel-sample”);
var myQuery = couchbase.N1qlQuery();
©2015 Couchbase Inc. 11
Node.js
function query(sql, done) {
var queryToRun = myQuery.fromString(sql);
myBucket.query(queryToRun, function(error, result) {
if(error) {
console.log(“ERROR: “, error);
done(error, null);
return;
}
done(null, result);
return;
});
}
©2015 Couchbase Inc. 12
Node.js
function query(sql, done) {
var queryToRun = myQuery.fromString(sql);
myBucket.query(queryToRun, function(error, result) {
if(error) {
console.log(“ERROR: “, error);
done(error, null);
return;
}
done(null, result);
return;
});
}
©2015 Couchbase Inc. 13
Node.js
function query(sql, done) {
var queryToRun = myQuery.fromString(sql);
myBucket.query(queryToRun, function(error, result) {
if(error) {
console.log(“ERROR: “, error);
done(error, null);
return;
}
done(null, result);
return;
});
}
©2015 Couchbase Inc. 14
Node.js
function query(sql, done) {
var queryToRun = myQuery.fromString(sql);
myBucket.query(queryToRun, function(error, result) {
if(error) {
console.log(“ERROR: “, error);
done(error, null);
return;
}
done(null, result);
return;
});
}
©2015 Couchbase Inc. 15
Node.js
function query(sql, done) {
var queryToRun = myQuery.fromString(sql);
myBucket.query(queryToRun, function(error, result) {
if(error) {
console.log(“ERROR: “, error);
done(error, null);
return;
}
done(null, result);
return;
});
}
©2015 Couchbase Inc. 16
Node.js
function query(sql, done) {
var queryToRun = myQuery.fromString(sql);
myBucket.query(queryToRun, function(error, result) {
if(error) {
console.log(“ERROR: “, error);
done(error, null);
return;
}
done(null, result);
return;
});
}
©2015 Couchbase Inc. 17
Node.js Data Querying
 Document lookups
 Couchbase views
 N1QL
©2015 Couchbase Inc. 18
Node.jsView Query
var query =ViewQuery.from("travel", "by_name").skip(6).limit(3);
myBucket.query(query, function(error, results) {
for(i in results) {
console.log("Row: ", results[i]);
}
});
DemoTime!
©2015 Couchbase Inc. 20
Node.js Application Design
AngularJS
Client Frontend
Node.js
Server Backend
©2015 Couchbase Inc. 21
Node.js Separation of Frontend and Backend
 No Jade markup
 API driven
 Less client and server coupling
 The backend can evolve without affecting the frontend
 Frontend can be extended to web as well as mobile
©2015 Couchbase Inc. 22
Multiple Frontends & One Backend
©2015 Couchbase Inc. 23
The Node.js Backend
©2015 Couchbase Inc. 24
Node.js Configuration
// config.json
{
"couchbase": {
"server": "127.0.0.1:8091",
"bucket": "restful-sample"
}
}
©2015 Couchbase Inc. 25
Node.js Configuration
// Project’s app.js file
var express = require("express");
var bodyParser = require("body-parser");
var couchbase = require("couchbase");
var path = require("path");
var config = require("./config");
var app = express();
©2015 Couchbase Inc. 26
Node.js Configuration
// app.js continued…
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
module.exports.bucket = (new
couchbase.Cluster(config.couchbase.server)).openBucket(config.couchbase.bucket);
app.use(express.static(path.join(__dirname, "public")));
var routes = require("./routes/routes.js")(app);
var server = app.listen(3000, function () {
console.log("Listening on port %s...", server.address().port);
});
©2015 Couchbase Inc. 27
Node.js Create or Update Endpoint
// routes.js
app.post("/api/create", function(req, res) {
if(!req.body.firstname) {
return res.status(400).send({"status": "error", "message": "A firstname is required"});
}
// …
RecordModel.create(req.body, function(error, result) {
if(error) {
return res.status(400).send(error);
}
res.send(result);
});
});
©2015 Couchbase Inc. 28
Node.js Get Document Endpoint
// routes.js continued…
app.get("/api/get", function(req, res) {
if(!req.query.document_id) {
return res.status(400).send({"status": "error", "message": "A document id is required"});
}
RecordModel.getByDocumentId(req.query.document_id, function(error, result) {
if(error) {
return res.status(400).send(error);
}
res.send(result);
});
});
©2015 Couchbase Inc. 29
Node.js Delete Endpoint
// routes.js continued…
app.post("/api/delete", function(req, res) {
if(!req.body.document_id) {
return res.status(400).send({"status": "error", "message": "A document id is required"});
}
RecordModel.delete(req.body.document_id, function(error, result) {
if(error) {
return res.status(400).send(error);
}
res.send(result);
});
});
©2015 Couchbase Inc. 30
Node.js Upsert Document Function
// recordmodel.js
RecordModel.save = function(data, callback) {
var jsonObject = {
type: “user”,
firstname: data.firstname,
lastname: data.lastname,
email: data.email
}
var documentId = data.document_id ? data.document_id : uuid.v4();
db.upsert(documentId, jsonObject, function(error, result) {
if(error) {
return callback(error, null);
}
callback(null, {message: "success", data: result});
});
}
©2015 Couchbase Inc. 31
Couchbase JSON Document
©2015 Couchbase Inc. 32
Node.js Get Document with N1QL Function
// recordmodel.js continued…
RecordModel.getByDocumentId = function(documentId, callback) {
var statement = "SELECT firstname, lastname, email " +
"FROM `" + config.couchbase.bucket + "` AS users " +
"WHERE META(users).id = $1";
var query = N1qlQuery.fromString(statement);
db.query(query, [documentId], function(error, result) {
if(error) {
return callback(error, null);
}
callback(null, result);
});
};
©2015 Couchbase Inc. 33
Node.js Delete Document Function
// recordmodel.js continued…
RecordModel.delete = function(documentId, callback) {
db.remove(documentId, function(error, result) {
if(error) {
callback(error, null);
return;
}
callback(null, {message: "success", data: result});
});
};
©2015 Couchbase Inc. 34
The AngularJS Frontend
©2015 Couchbase Inc. 35
// AngularJS app.js
$scope.fetchAll = function() {
$http(
{
method: "GET",
url: "/api/getAll"
}
)
.success(function(result) {
for(var i = 0; i < result.length; i++) {
$scope.items[result[i].id] = result[i];
}
});
}
©2015 Couchbase Inc. 36
// AngularJS app.s
$scope.save = function(firstname, lastname, email) {
$http(
{
method: "POST",
url: "/api/create",
data: {
firstname: firstname,
lastname: lastname,
email: email,
document_id: $stateParams.documentId
}
}
)
}
A Further Look AtThe Code…
©2015 Couchbase Inc. 38
More Complex Node.js Queries
©2015 Couchbase Inc. 39
Node.jsTravel Sample
FlightPath.findAll = function(documentId, callback) {
var statement = "SELECT faa AS fromAirport, geo " +
"FROM `" + config.couchbase.bucket + "` r" +
"WHERE airportname = $1 " +
"UNION SELECT faa AS toAirport, geo " +
"FROM `" + config.couchbase.bucket + "` r" +
"WHERE airportname = $2";
var query = N1qlQuery.fromString(statement);
db.query(query, [from, to], function(error, result) {
if(error) {
return callback(error, null);
}
callback(null, result);
});
};
©2015 Couchbase Inc. 40
Node.jsTravel Sample
FlightPath.findAll = function(documentId, callback) {
var statement = "SELECT r.id, a.name, s.flight, s.utc, r.sourceairport, r.destinationairport, r.equipment " +
"FROM `" + config.couchbase.bucket + "` r" +
"UNNEST r.schedule s " +
"JOIN `" + config.couchbase.bucket + "` a ON KEYS r.airlineid " +
"WHERE r.sourceairport = $1AND r.destinationairport = $2AND s.day = $3 ”
"ORDER BY a.name";
var query = N1qlQuery.fromString(statement);
db.query(query, [queryFrom, queryTo, leave], function(error, result) {
if(error) {
return callback(error, null);
}
callback(null, result);
});
};
©2015 Couchbase Inc. 41
Node.js Sample Applications
https://github.com/couchbaselabs/try-cb-nodejs
https://github.com/couchbaselabs/restful-angularjs-nodejs
©2015 Couchbase Inc. 42
Couchbase N1QLTutorial
http://query.pub.couchbase.com/tutorial
Questions?
©2014 Couchbase, Inc.
©2015 Couchbase Inc. 44
Couchbase
We’re Hiring!
©2014 Couchbase, Inc.
©2015 Couchbase Inc. 45©2014 Couchbase, Inc.
ThankYou
Nic Raboy
Developer Advocate at Couchbase
@nraboy (Twitter)

Quick and Easy Development with Node.js and Couchbase Server

  • 1.
    ©2015 Couchbase Inc.1 Nic Raboy, Developer Advocate at Couchbase Quick and Easy Development with Node.js and Couchbase Server
  • 2.
    ©2015 Couchbase Inc.2 About Me Nic Raboy Developer Advocate at Couchbase @nraboy (Twitter) Node.js, Android, Java, Ionic Framework, NoSQL, SQL
  • 3.
    ©2015 Couchbase Inc.3 What Is Couchbase?
  • 4.
    ©2015 Couchbase Inc.4 What makes Couchbase unique? 4 Performance & scalability leader Sub millisecond latency with high throughput; memory-centric architecture Multi- purpose Simplified administration Easy to deploy & manage; integrated Admin Console, single- click cluster expansion & rebalance Cache, key value store, document database, and local/mobile database in single platform Always-on availability Data replication across nodes, clusters, and data centers Enterprises choose Couchbase for several key advantages 24x365
  • 5.
    ©2015 Couchbase Inc.5  Consolidated cache and database  Tune memory required based on application requirements Multi-purpose database supports many uses 5 5 Tunable built-in cache Flexible schemas with JSON Couchbase Lite  Represent data with varying schemas using JSON on the server or on the device  Index and query data with Javascript views  Light weight embedded DB for always available apps  Sync Gateway syncs data seamlessly with Couchbase Server
  • 6.
    ©2015 Couchbase Inc.6 Couchbase leads in performance and scalability Auto Sharding Memory-memory XDCR Single NodeType  No manual sharding  Database manages data movement to scale out – not the user  Market’s only memory-to- memory database replication across clusters and geos  Provides disaster recover / data locality  Hugely simplifies management of clusters  Easy to scale clusters by adding any number of nodes
  • 7.
    ©2015 Couchbase Inc.7 Available Couchbase Server SDKs And more…
  • 8.
    ©2015 Couchbase Inc.8 Overview of the Node.js SDK
  • 9.
    ©2015 Couchbase Inc.9 Node.js SDK  Uses the high performance Couchbase C library  Compatible with Node.js frameworks  Minimal coding
  • 10.
    ©2015 Couchbase Inc.10 Node.js // InstantiateThe Query API var couchbase = require(“couchbase”); var myCluster = new Couchbase.Cluster(“localhost:8091”); var myBucket = myCluster.openBucket(“travel-sample”); var myQuery = couchbase.N1qlQuery();
  • 11.
    ©2015 Couchbase Inc.11 Node.js function query(sql, done) { var queryToRun = myQuery.fromString(sql); myBucket.query(queryToRun, function(error, result) { if(error) { console.log(“ERROR: “, error); done(error, null); return; } done(null, result); return; }); }
  • 12.
    ©2015 Couchbase Inc.12 Node.js function query(sql, done) { var queryToRun = myQuery.fromString(sql); myBucket.query(queryToRun, function(error, result) { if(error) { console.log(“ERROR: “, error); done(error, null); return; } done(null, result); return; }); }
  • 13.
    ©2015 Couchbase Inc.13 Node.js function query(sql, done) { var queryToRun = myQuery.fromString(sql); myBucket.query(queryToRun, function(error, result) { if(error) { console.log(“ERROR: “, error); done(error, null); return; } done(null, result); return; }); }
  • 14.
    ©2015 Couchbase Inc.14 Node.js function query(sql, done) { var queryToRun = myQuery.fromString(sql); myBucket.query(queryToRun, function(error, result) { if(error) { console.log(“ERROR: “, error); done(error, null); return; } done(null, result); return; }); }
  • 15.
    ©2015 Couchbase Inc.15 Node.js function query(sql, done) { var queryToRun = myQuery.fromString(sql); myBucket.query(queryToRun, function(error, result) { if(error) { console.log(“ERROR: “, error); done(error, null); return; } done(null, result); return; }); }
  • 16.
    ©2015 Couchbase Inc.16 Node.js function query(sql, done) { var queryToRun = myQuery.fromString(sql); myBucket.query(queryToRun, function(error, result) { if(error) { console.log(“ERROR: “, error); done(error, null); return; } done(null, result); return; }); }
  • 17.
    ©2015 Couchbase Inc.17 Node.js Data Querying  Document lookups  Couchbase views  N1QL
  • 18.
    ©2015 Couchbase Inc.18 Node.jsView Query var query =ViewQuery.from("travel", "by_name").skip(6).limit(3); myBucket.query(query, function(error, results) { for(i in results) { console.log("Row: ", results[i]); } });
  • 19.
  • 20.
    ©2015 Couchbase Inc.20 Node.js Application Design AngularJS Client Frontend Node.js Server Backend
  • 21.
    ©2015 Couchbase Inc.21 Node.js Separation of Frontend and Backend  No Jade markup  API driven  Less client and server coupling  The backend can evolve without affecting the frontend  Frontend can be extended to web as well as mobile
  • 22.
    ©2015 Couchbase Inc.22 Multiple Frontends & One Backend
  • 23.
    ©2015 Couchbase Inc.23 The Node.js Backend
  • 24.
    ©2015 Couchbase Inc.24 Node.js Configuration // config.json { "couchbase": { "server": "127.0.0.1:8091", "bucket": "restful-sample" } }
  • 25.
    ©2015 Couchbase Inc.25 Node.js Configuration // Project’s app.js file var express = require("express"); var bodyParser = require("body-parser"); var couchbase = require("couchbase"); var path = require("path"); var config = require("./config"); var app = express();
  • 26.
    ©2015 Couchbase Inc.26 Node.js Configuration // app.js continued… app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: true })); module.exports.bucket = (new couchbase.Cluster(config.couchbase.server)).openBucket(config.couchbase.bucket); app.use(express.static(path.join(__dirname, "public"))); var routes = require("./routes/routes.js")(app); var server = app.listen(3000, function () { console.log("Listening on port %s...", server.address().port); });
  • 27.
    ©2015 Couchbase Inc.27 Node.js Create or Update Endpoint // routes.js app.post("/api/create", function(req, res) { if(!req.body.firstname) { return res.status(400).send({"status": "error", "message": "A firstname is required"}); } // … RecordModel.create(req.body, function(error, result) { if(error) { return res.status(400).send(error); } res.send(result); }); });
  • 28.
    ©2015 Couchbase Inc.28 Node.js Get Document Endpoint // routes.js continued… app.get("/api/get", function(req, res) { if(!req.query.document_id) { return res.status(400).send({"status": "error", "message": "A document id is required"}); } RecordModel.getByDocumentId(req.query.document_id, function(error, result) { if(error) { return res.status(400).send(error); } res.send(result); }); });
  • 29.
    ©2015 Couchbase Inc.29 Node.js Delete Endpoint // routes.js continued… app.post("/api/delete", function(req, res) { if(!req.body.document_id) { return res.status(400).send({"status": "error", "message": "A document id is required"}); } RecordModel.delete(req.body.document_id, function(error, result) { if(error) { return res.status(400).send(error); } res.send(result); }); });
  • 30.
    ©2015 Couchbase Inc.30 Node.js Upsert Document Function // recordmodel.js RecordModel.save = function(data, callback) { var jsonObject = { type: “user”, firstname: data.firstname, lastname: data.lastname, email: data.email } var documentId = data.document_id ? data.document_id : uuid.v4(); db.upsert(documentId, jsonObject, function(error, result) { if(error) { return callback(error, null); } callback(null, {message: "success", data: result}); }); }
  • 31.
    ©2015 Couchbase Inc.31 Couchbase JSON Document
  • 32.
    ©2015 Couchbase Inc.32 Node.js Get Document with N1QL Function // recordmodel.js continued… RecordModel.getByDocumentId = function(documentId, callback) { var statement = "SELECT firstname, lastname, email " + "FROM `" + config.couchbase.bucket + "` AS users " + "WHERE META(users).id = $1"; var query = N1qlQuery.fromString(statement); db.query(query, [documentId], function(error, result) { if(error) { return callback(error, null); } callback(null, result); }); };
  • 33.
    ©2015 Couchbase Inc.33 Node.js Delete Document Function // recordmodel.js continued… RecordModel.delete = function(documentId, callback) { db.remove(documentId, function(error, result) { if(error) { callback(error, null); return; } callback(null, {message: "success", data: result}); }); };
  • 34.
    ©2015 Couchbase Inc.34 The AngularJS Frontend
  • 35.
    ©2015 Couchbase Inc.35 // AngularJS app.js $scope.fetchAll = function() { $http( { method: "GET", url: "/api/getAll" } ) .success(function(result) { for(var i = 0; i < result.length; i++) { $scope.items[result[i].id] = result[i]; } }); }
  • 36.
    ©2015 Couchbase Inc.36 // AngularJS app.s $scope.save = function(firstname, lastname, email) { $http( { method: "POST", url: "/api/create", data: { firstname: firstname, lastname: lastname, email: email, document_id: $stateParams.documentId } } ) }
  • 37.
    A Further LookAtThe Code…
  • 38.
    ©2015 Couchbase Inc.38 More Complex Node.js Queries
  • 39.
    ©2015 Couchbase Inc.39 Node.jsTravel Sample FlightPath.findAll = function(documentId, callback) { var statement = "SELECT faa AS fromAirport, geo " + "FROM `" + config.couchbase.bucket + "` r" + "WHERE airportname = $1 " + "UNION SELECT faa AS toAirport, geo " + "FROM `" + config.couchbase.bucket + "` r" + "WHERE airportname = $2"; var query = N1qlQuery.fromString(statement); db.query(query, [from, to], function(error, result) { if(error) { return callback(error, null); } callback(null, result); }); };
  • 40.
    ©2015 Couchbase Inc.40 Node.jsTravel Sample FlightPath.findAll = function(documentId, callback) { var statement = "SELECT r.id, a.name, s.flight, s.utc, r.sourceairport, r.destinationairport, r.equipment " + "FROM `" + config.couchbase.bucket + "` r" + "UNNEST r.schedule s " + "JOIN `" + config.couchbase.bucket + "` a ON KEYS r.airlineid " + "WHERE r.sourceairport = $1AND r.destinationairport = $2AND s.day = $3 ” "ORDER BY a.name"; var query = N1qlQuery.fromString(statement); db.query(query, [queryFrom, queryTo, leave], function(error, result) { if(error) { return callback(error, null); } callback(null, result); }); };
  • 41.
    ©2015 Couchbase Inc.41 Node.js Sample Applications https://github.com/couchbaselabs/try-cb-nodejs https://github.com/couchbaselabs/restful-angularjs-nodejs
  • 42.
    ©2015 Couchbase Inc.42 Couchbase N1QLTutorial http://query.pub.couchbase.com/tutorial
  • 43.
  • 44.
    ©2015 Couchbase Inc.44 Couchbase We’re Hiring! ©2014 Couchbase, Inc.
  • 45.
    ©2015 Couchbase Inc.45©2014 Couchbase, Inc. ThankYou Nic Raboy Developer Advocate at Couchbase @nraboy (Twitter)

Editor's Notes

  • #5 Couchbase has emerged as a leading NoSQL provider for number of reasons: Best in performance and scalability We’ve engineered Couchbase from the ground up for high performance and scalability Couchbase is designed to deliver sub-millisecond responsiveness with very high throughput for both reads and writes We consistently outperform competitors like MongoDB and DataStax in multiple independent benchmarks Our performance advantage is driven in large part by our memory-centric architecture, which includes an integrated managed object cache and stream-based replication Broad use case support We’re the only NoSQL provider that has consolidated distributed cache, key-value store, and a JSON-based document database in a single platform This means customers can use Couchbase for a much broader range of applications Integrated mobile solution We’re the only vendor that provides an end-to-end NoSQL mobile solution -- allows customers to easily build mobile apps that run great on or offline Includes a JSON database embedded on the device, along with a prebuilt syncing tier So apps run great on the device, even without a network connection or no connectivity at all Data on the device auto-syncs with the backend server when a connection is available Simplified administration We’ve designed Couchbase to be exceptionally easy to deploy and manage Features such as an integrated Admin Console and single-click cluster expansion & rebalance dramatically increase admin efficiency