JS on Backend

Express & Mongo

Created by Maksym Tarasenko

Agenda

  • REST
  • Express.js
  • MongoDB
  • Mongoose

REST

Representational State Transfer

CRUD

Express.js – a node.js web framework

  • Based on Connect
  • De facto standard framework of node web apps
  • Minimalistic
  • Supports a variety of middleware

Basics

  • Middleware concept
  • Configuration of express
  • Request
  • Response

Middleware

Middleware concept

var express = require('express'); var app = express(); app.use(bodyParser.json()); app.use(function (req, res, next) { console.log('Time:', Date.now()); next(); }); app.get('/user', function(req, res) { res.send('hello user'); }); app.listen(3000, function () { console.log('Example app listening on port 3000!'); });

Routing

  • Respond to HTTP requests with a callback
  • Supports variable placement in routes
  • Easy to serve JSON
  • Routing filter types

Routing

app.get('/', function (req, res) {}); app.post('/:id', function (req, res) {}); var express = require('express'); var router = express.Router(); router.put(/\/abc|\/xyz/, function (req, res) {}}); router.delete(['/', '/:id'], function (req, res) {});

Templating

app.set('view engine', 'ejs'); app.locals.title = 'My App'; app.get('/', function (req, res) { res.locals.someText = 'test'; res.render('test', { message: 'Hello there!'});; });

MongoDB Basics

  • DataBase
  • Collection
  • Document
  • Field

Create

db.unicorns .insert({ name: 'Aurora', dob: new Date(1992,2,13,7,47), loves: ['carrot','papaya'], weight: 600, gender: 'm', vampires: 63 });

Find

db.unicorns.find({gender: 'm', weight: {$gt: 700}}) db.unicorns.find({gender: {$ne: 'f'}, weight: {$gte: 701}}) //$lt, $lte, $gt, $gte, $ne, $or db.unicorns.find({ gender: 'f', $or: [ {loves: 'apple'}, {loves: 'orange'}, {weight: {$lt: 500}} ]}) //Projection db.unicorns.find({vampires: {$exists: false}}, { name:1, _id: 0}) .skip(2) .limit(5) .sort({name:1})

update

db.unicorns.insert({}) db.unicorns.insert([{}, {}]) db.unicorns.update( {gender: 'm'},// selector { $set: {loves: "grape"}, $currentDate: {dob: true} },//update { multi: true, upsert: true } ) // remove all db.unicorns.remove({}) // remove match condition db.unicorns.remove({type: "food"}) // remove match condition only one db.unicorns.remove({type: "food"}, 1)

ORM-way: Mongoose

  • SCHEMA
  • MODEL
  • Fields types

Connection

var mongoose = require('mongoose'); mongoose.connect('mongodb://localhost/test'); var db = mongoose.connection; mongoose.Promise = require('q').Promise; db.on('error', function(err) { console.error('connection error:', err)); }); db.once('open', function (callback) { console.log('connected'); });

MODEL

var mongoose = require('mongoose'); var Schema = mongoose.Schema; var RolesSchema = new Schema({ role: { type: String, required: true }, date: {type: Date, default: Date.now}, members: [{ type: String }] }, {collection: 'roles'}); module.exports = mongoose.model('Roles', RolesSchema);

MODEL

RolesSchema.methods.findAllMembersRoles = function () { return this.model('Roles').find({members: this.members}); } RolesSchema.statics.findByName = function (name) { return this.find({role: new RegExp(name, 'i')}); } RolesSchema.virtual('membersAll') .get(function () { return this.members.join(','); }) .set(function (members) { var membersArray = members.split(','); this.members = membersArray; });

Work with model: Save

var newModel = new model({ role: 'dev', members: ['user1', 'user3'] }); newModel.save(function (err) { if (err) return handleError(err); saved! }); newModel.save() .then() .catch()

Work with model: Find

model.find({role: 'dev'}) .skip(skip) .limit(limit) model.findById(id) .then(function (modelInstance) { var updatedInstance = _.extend(modelInstance, req.body); return updatedInstance.save(); })

Work with model: Find

model.remove({role: 'dev'}) model.update({ role: 'dev' }, { $set: {members: ['user2']} })

Questions?