Successfully reported this slideshow.

Intro to Sail.js

2,596 views

Published on

Sails.js is a realtime MVC framework for Node.js that is inspired by some of the best ideas behind Ruby on Rails and realtime frameworks like Meteor.js.

In this presentation I'll overview getting started with Sails.js, its architecture and features, as well as some advice on place to look at when you are getting started.

Learn a brand new way to think about web application development with Node.js!

Published in: Technology
  • Be the first to comment

Intro to Sail.js

  1. 1. http://www.meetup.com/Pittsburgh-Node-js/
  2. 2. NICHOLAS MCCLAY UX Developer @nickmcclay
  3. 3. MEET YOUR NEIGHBOR
  4. 4. Framework Overview
  5. 5. SAILS HIGHLIGHTS • Robust Node.js MVC web server framework ! • Railsy features - scaffolding, DB agnostic ORM ! • Automatically generated RESTful JSON API ! • Out-of-the-box real-time socket.io integration ! • Role based access policies and ACL ! • JS/CSS asset bundling and minification (Grunt)
  6. 6. QUICK NOTE: Convention > Configuration = Magic
  7. 7. WHAT IS A SINGLE PAGE APPLICATION?
  8. 8. TRADITIONAL WEB APPLICATION
  9. 9. http://www.cutekitties.com/kitten/1 One Kitten Please! HTTP Request
  10. 10. Response HTML JavaScript CSS
  11. 11. TADA! WEB PAGE!
  12. 12. SINGLE PAGE APPLICATION
  13. 13. http://www.cutekitties.com#/kitten/1 One Kitten Please! HTTP Request
  14. 14. Application Response HTML JavaScript CSS
  15. 15. /kitten/1?format=json GET /kitten/1 A JAX Request
  16. 16. [{
 "_id" : "abc124efg345",
 "lives" : 9,
 "curiousity" : "massive",
 "cuteness" : 9999,
 "eyes" : "blue",
 "fur" : "yellow"
 }] Response JSON
  17. 17. TADA! WEB APP!
  18. 18. Heading out to sea
  19. 19. SAILS VERSIONS V0.9 Coming V0.10 V0.10 Soon • Current NPM default • beta version (RC3) • Reliable starting place • Significant Refactors • What I’ll be demoing • API changes in this presentation • Associations • Here be dragons… https://github.com/balderdashy/sails-docs/blob/master/Migration-Guide.md
  20. 20. DOCUMENTATION SOURCES Official Website Documentation http://sailsjs.org/#!documentation GitHub Documentation Repo Coming V0.10 Soon https://github.com/balderdashy/sails-docs/tree/0.10
  21. 21. CREATE A NEW SAILS PROJECT http://sailsjs.org/#!getStarted
  22. 22. 0.10.0 NPM INSTALL WEIRDNESS If you encounter this, try: npm install -g
  23. 23. SAILS CLI BASICS Turn on asset linking Make a new app sails new <appName> Run App sails lift --linker Set Env Config Display all logs --dev --prod --verbose Display Sails.js Version sails version
  24. 24. SAILS SCAFFOLDING Generate Scaffolding sails generate (type) <id> model, controller, default is both Pluggable Generators for Scaffolding Coming V0.10 Soon sails generate (type) <id> model, controller, api, blog, user, whatever you want!
  25. 25. MODELS (Waterline Collection) api/models var Person = {
 schema : true,
 attributes: {
 firstName: 'string',
 lastName: 'string',
 password : {
 type : 'string',
 required : true,
 notEmpty : true
 },
 age : {
 type: 'integer',
 max: 150,
 required: true
 },
 birthDate: 'date',
 phoneNumber: {
 type: 'string',
 defaultsTo: '111-222-3333'
 },
 emailAddress: {
 type: 'email', // Email type will get validated by the ORM
 required: true
 }
 }
 };
 model.exports = Person;
  26. 26. BEYOND ATTRIBUTES // Define a custom instance method
 fullName: function() {
 return this.firstName + ' ' + this.lastName;
 },
 
 
 // Lifecycle Callbacks
 beforeCreate: function(values, next) {
 bcrypt.hash(values.password, 10, function(err, hash) {
 if(err) return next(err);
 values.password = hash;
 next();
 });
 },
 // Override toJSON instance method
 // to remove phoneNumber value
 toJSON: function() {
 var obj = this.toObject();
 delete obj.password;
 return obj;
 }
  27. 27. ORM - WATERLINE https://github.com/balderdashy/waterline • ActiveRecord, Hibernate, and Mongoose • emphasis on modularity, testability, and consistency across adapters • Waterline Adapter -> DB Query • Custom Adapter methods
  28. 28. Coming ASSOCIATIONS V0.10 Associate models across different data stores Defining Association var Blog = {
 attributes : {
 title : 'string',
 body : 'string',
 author : {
 model : 'person'
 }
 }
 }; Soon Relationship Types • One way • One-to-One • One-to-Many • Many-to-Many Blog.find({title:'Sails.js Presentation'}).populate('author').exec(console.log);
  29. 29. Full Sail Ahead!
  30. 30. RESOURCEFUL ROUTING CRUD Routes get /:controller/:id? post /:controller put /:controller/:id delete /:controller/:id FREE To disable set the ‘shortcuts’ flag to false in config/controllers.js, REST Routes /:controller/find/:id? /:controller/create /:controller/update/:id /:controller/destroy/:id FREE ! To disable set the ‘rest’ flag to false in config/controllers.js
  31. 31. CONTROLLERS api/controllers var ChickenController = {
 // Peck the chicken specified by id (subtract 50 HP)
 peck: function (req,res) {
 Chicken.find(req.param('id')).exec(function (err, chicken) {
 if (err) return res.send(err,500);
 if (!chicken) return res.send("No other chicken with that id exists!", 404);
 if (chicken.hp <= 0) return res.send("The other chicken is already dead!", 403);
 chicken.hp -= 50; // Subtract 50 HP from the chicken
 
 chicken.save(function (err) { // Persist the change
 if (err) return res.send(err,500);
 // Report back with the new state of the chicken
 res.json(chicken);
 });
 });
 }
 };
 module.exports = ChickenController;
  32. 32. SOCKET.IO http://socket.io/ // all controller routes return valid responses
 socket.get('/todo/count', function(results) { console.log(results) });
 
 // create a new item
 socket.post('/todo', {"title" : "this is from sockets"}, function(err,results) { console.log(err,results) });
 
 // all valid ways to update with websockets
 socket.put('/todo', {'id' : 1, 'title' : "updated1"}, function(results) { console.log(results) });
 socket.put('/todo/1', {'title' : "updated2"}, function(results) { console.log(results) });
 socket.get('/todo/update/1', {'title' : "updated3"}, function(results) { console.log(results) });
 
 // all valid ways to delete with websockets
 socket.delete('/todo', {'id' : 1}, function(results) { console.log(results) });
 socket.delete('/todo/1', function(results) { console.log(results) });
 socket.get('/todo/delete/21',function(results) { console.log(results)});
 
 // listen for messages
 socket.on('message', function(message) { console.log(message) });
 
 // listen for messages from a specific controller
 socket.on('todo',function(message) { console.log(message) }); Coming V0.10 Soon
  33. 33. POLICIES api/policies/isAuthenticated.js module.exports = function(req, res, next) {
 // User is allowed, proceed to the next policy, 
 // or if this is the last policy, the controller
 if (req.session.authorized == true) {
 return next();
 }
 
 // User is not allowed
 // (default res.forbidden() behavior can be overridden in `config/403.js`)
 return res.forbidden('You are not permitted to perform this action.');
 }; config/policies.js module.exports.policies = {
 // Default policy for all controllers and actions
 // (`true` allows public access) 
 '*': true,
 
 // Policies for /Foo/* routes
 FooController: {
 "*" : true,
 'update' : 'isAuthenticated',
 'destroy' : ['isAuthenticated','isOwner']
 }
 };
  34. 34. ASSET MANAGEMENT assets/linker/ Enabling Asset Linking sails new <appName> --linker Place Assets in between special linker flags
  35. 35. GET STARTED BUILDING https://github.com/cgmartin/sailsjs-angularjs-bootstrap-example https://www.npmjs.org/package/generator-sails http://irlnathan.github.io/sailscasts/
  36. 36. THANKS! @nickmcclay

×