Getting Started: Couchbase Server Node.js SDK – Couchbase Live New York 2015

41
©2015 Couchbase Inc. 1 Nic Raboy, Developer Advocate at Couchbase Getting Started: Couchbase Server Node.js SDK

Transcript of Getting Started: Couchbase Server Node.js SDK – Couchbase Live New York 2015

©2015 Couchbase Inc. 1

Nic Raboy, Developer Advocate at Couchbase

Getting Started: Couchbase Server Node.js SDK

©2015 Couchbase Inc. 2

About Me

Nic RaboyDeveloper Advocate at [email protected]@nraboy (Twitter)

Node.js, Android, Java, Ionic Framework, NoSQL, SQL

©2015 Couchbase Inc. 3

Available Couchbase Server SDKs

And more…

©2015 Couchbase Inc. 4

Overview of the Node.js SDK

©2015 Couchbase Inc. 5

Node.js SDK

Uses the high performance Couchbase C library Compatible with Node.js frameworks Minimal coding

©2015 Couchbase Inc. 6

Node.js// Instantiate The 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. 7

Node.jsfunction 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. 8

Node.jsfunction 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. 9

Node.jsfunction 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. 10

Node.jsfunction 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. 11

Node.jsfunction 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.jsfunction 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 Data Querying

Document lookups Couchbase views N1QL

©2015 Couchbase Inc. 14

Node.js View Queryvar 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]); }});

Demo Time!

©2015 Couchbase Inc. 16

Node.js Application Design

AngularJSClient Frontend

Node.jsServer Backend

©2015 Couchbase Inc. 17

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. 18

Multiple Frontends & One Backend

©2015 Couchbase Inc. 19

The Node.js Backend

©2015 Couchbase Inc. 20

Node.js Configuration

// config.json

{ "couchbase": { "server": "127.0.0.1:8091", "bucket": "restful-sample" }}

©2015 Couchbase Inc. 21

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. 22

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. 23

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. 24

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. 25

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. 26

Node.js Upsert Document Function// recordmodel.jsRecordModel.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. 27

Couchbase JSON Document

©2015 Couchbase Inc. 28

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. 29

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. 30

The AngularJS Frontend

©2015 Couchbase Inc. 31

// 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. 32

// 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 At The Code…

©2015 Couchbase Inc. 34

More Complex Node.js Queries

©2015 Couchbase Inc. 35

Node.js Travel SampleFlightPath.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. 36

Node.js Travel SampleFlightPath.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 = $1 AND r.destinationairport = $2 AND 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. 37

Node.js Sample Applications

https://github.com/couchbaselabs/try-cb-nodejshttps://github.com/couchbaselabs/restful-angularjs-nodejs

©2015 Couchbase Inc. 38

Couchbase N1QL Tutorial

http://query.pub.couchbase.com/tutorial

Questions?

©2014 Couchbase, Inc.

©2014 Couchbase, Inc. ©2015 Couchbase Inc. 40

Couchbase

We’re Hiring!

©2014 Couchbase, Inc. ©2015 Couchbase Inc. 41

Thank You

Nic RaboyDeveloper Advocate at [email protected]@nraboy (Twitter)