Getting Started: Couchbase Server Node.js SDK – Couchbase Live New York 2015
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. 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. 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]); }});
©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. 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. 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. 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 } } )}
©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
©2014 Couchbase, Inc. ©2015 Couchbase Inc. 41
Thank You
Nic RaboyDeveloper Advocate at [email protected]@nraboy (Twitter)