Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Présentation Sails @ SupInfo
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Sylvain PONTOREAU
March 26, 2014
Technology
0
130
Présentation Sails @ SupInfo
Présentation générale du framework
Sylvain PONTOREAU
March 26, 2014
Tweet
Share
More Decks by Sylvain PONTOREAU
See All by Sylvain PONTOREAU
aMS Lausanne - Préparez-vous à une virée intersidérale avec Azure Cosmos DB 🧑🚀
spontoreau
0
51
TypeScript - 45 minutes pour s’y mettre !
spontoreau
0
140
Event Sourcing avec Azure, quelle base de données choisir
spontoreau
0
77
Decorators in TypeScript 5.0, everything you need to know!
spontoreau
0
470
Leverage your CI/CD at the next level with Github actions
spontoreau
0
61
Commit comme un(e) "Hipster" avec Gitmoji !
spontoreau
0
160
Bird of a Feather - TypeScript (Devoxx 2022)
spontoreau
0
39
GitHub - Du besoin jusqu'à la production avec Github et Azure
spontoreau
0
42
Behavior Driven Development
spontoreau
1
280
Other Decks in Technology
See All in Technology
【Ubie】AIを活用した広告アセット「爆速」生成事例 | AI_Ops_Community_Vol.2
yoshiki_0316
1
130
Bill One急成長の舞台裏 開発組織が直面した失敗と教訓
sansantech
PRO
2
430
AWS Network Firewall Proxyを触ってみた
nagisa53
1
260
StrandsとNeptuneを使ってナレッジグラフを構築する
yakumo
1
140
Bedrock PolicyでAmazon Bedrock Guardrails利用を強制してみた
yuu551
0
280
GitHub Issue Templates + Coding Agentで簡単みんなでIaC/Easy IaC for Everyone with GitHub Issue Templates + Coding Agent
aeonpeople
1
320
衛星画像即時マッピングサービスの実現に向けて
lehupa
0
150
Why Organizations Fail: ノーベル経済学賞「国家はなぜ衰退するのか」から考えるアジャイル組織論
kawaguti
PRO
1
260
マネージャー視点で考えるプロダクトエンジニアの評価 / Evaluating Product Engineers from a Manager's Perspective
hiro_torii
0
240
AWS DevOps Agent x ECS on Fargate検証 / AWS DevOps Agent x ECS on Fargate
kinunori
3
360
Context Engineeringの取り組み
nutslove
0
440
横断SREがSRE社内留学制度 / Enablingになぜ踏み切ったのか
rvirus0817
0
140
Featured
See All Featured
VelocityConf: Rendering Performance Case Studies
addyosmani
333
24k
4 Signs Your Business is Dying
shpigford
187
22k
Designing Experiences People Love
moore
144
24k
Building an army of robots
kneath
306
46k
The Power of CSS Pseudo Elements
geoffreycrofte
80
6.2k
Rebuilding a faster, lazier Slack
samanthasiow
85
9.4k
Building a Scalable Design System with Sketch
lauravandoore
463
34k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
359
30k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.3k
Navigating Weather and Climate Data
rabernat
0
110
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
1
5.3k
Typedesign – Prime Four
hannesfritz
42
3k
Transcript
Sails : Framework MVC pour Node.js 26 Mars 2014 -
Sup’Info Montparnasse - Sylvain PONTOREAU
Sommaire 1 - Rappel sur Node 2 - Solutions MVC
pour Node.js 4 - Sails in action 3 - Présentation de Sails 5 - Conclusion
1 - Piqure de rappel sur… … Node.js ! -
Mono-Thread asynchrone piloté par event - JavaScript (Harmony features) - Google V8 - Module HTTP - Node Package Module
2 - Les Stacks MVC … … et leur popularité
! 1.5k 2.4k 5.5k 12k Meteor Kraken
3 - Présentation de … … Sails.js ! - Conçu
par et pour les développeurs - Orienté application d’entreprise - Affinité pour les données - Inspiré par Ruby on Rails - Idéal pour les applications temps réel
3 – Caractéristiques … … techniques ! - Convention over
Configuration - Stack RoR Like - Automatic Rest Back-end - ORM inside (Waterline) - Database Adapter - Action sur requête HTTP et WebSocket - Gestion des accès - Asset bundling - Sails CLI
3 – Qu’y a-t-il … … dans le stack !
Waterline Grunt Windson
4 - Sails in … … action ! Installation npm
install sails -g Créer un projet sails new myNewProject cd myNewProject npm update Lancer l’application sails lift
4 - Définition d’un … … modèle ! sails generate
person Person.js : module.exports = { attributes : { } }; attributes: { name : 'STRING', age : { type : 'INTEGER', required : true }, birthDate : 'DATE' } Types disponibles : string, text, integer, float, date, time, datetime, boolean, binary, array, json Validateurs disponibles : empty, required, email, url, ip, notNull, regex, contains, minLength, maxLength …
4 – Configuration … … des adapters Waterline ! npm
install sails-mongo --save config/adapter.js : module.exports.adapters = { default : 'mongo', mongo : { module : 'sails-mongo', host : 'localhost', port : 27017, user : 'username', password : 'password', database : 'Person' } };
4 – Automatic … … Rest Backend ! Requête POST
valide => { "name" : "sylvain", "age" : "30" , "birthDate" : “05/28/1983" } Response : { "name": "sylvain", "age": 30, "birthDate": "05/28/1983", "createdAt": "2014-03-24T10:11:46.358Z", "updatedAt": "2014-03-24T10:11:46.358Z", "id": "533004e24510daf41d7de305" } Requête POST non valide => { "name" : "sylvain", "age" : “30" , "birthDate" : “pasundate" } Response : { "status": 500, "errors": [{ "ValidationError": { "birthDate": [ { "data": "pasundate", "message": "Validation error: \"pasundate\" is not of type \"date\"", "rule": "date" }] } } ] }
4 – Automatic … … Rest Backend ! Requête GET
=> http://localhost:1337/Person Response : [ { "name": "sylvain", "age": 30, "birthDate": "05/28/1983", "createdAt": "2014-03-24T10:11:46.358Z", "updatedAt": "2014-03-24T10:11:46.358Z", "id": "533004e24510daf41d7de305" }, { "name": "bill", "age": 58, "birthDate": "10/28/1955", "createdAt": "2014-03-24T10:29:45.131Z", "updatedAt": "2014-03-24T10:29:45.131Z", "id": "533009194510daf41d7de306" }, … ] Requête GET => http://localhost:1337/Person?name=sylvain Response : { "name": "sylvain", "age": 30, "birthDate": "05/28/1983", "createdAt": "2014-03-24T10:11:46.358Z", "updatedAt": "2014-03-24T10:11:46.358Z", "id": "533004e24510daf41d7de305" }
4 - Socket.io … … inside ! Test dans chrome
:
4 - Création d’un contrôleur … et ses actions !
PersonController.js : module.exports = { _config: {} }; module.exports = { getAll : function(req, res){ Person.find().exec(function(err, data){ res.render('person/getAll', {persons : data}) }); }, _config: {} }; config/routes.js : module.exports.routes = { '/': { view: 'home/index' }, '/persons' : { controller : 'PersonController', action : 'getAll' } }; sails generate person
4 - Les vues … … avec EJS ! views/layout.ejs
: <!DOCTYPE html> <html> <head> <title><%- title %></title> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" /> </head> <body> <%- body %> <script type="text/javascript" src="/js/socket.io.js"></script> <script type="text/javascript" src="/js/sails.io.js"></script> <script type="text/javascript" src="/js/app.js"></script> </body> </html> views/person/getAll.ejs : <ul> <% for(var i=0; i < persons.length; i++) {%> <li> <%= persons[i].name %> - <%= persons[i].age %> - <%= persons[i].birthDate %> </li> <% } %> </ul>
4 – Policies … … et contrôle des accès !
api/policies/isAuthenticated.js : module.exports = function(req, res, next) { if (req.session.authenticated) { return next(); } return res.forbidden('You are not permitted to perform this action.'); }; config/policies.js : module.exports.policies = { //'*': true, PersonController: { '*': false, getAll : 'isAuthenticated', otherFunction : ['isAuthenticated', 'isAdmin'] } };
4 – Grunt … … et l’asset bundling gruntfile.js :
module.exports = function (grunt) { grunt.initConfig({ concat : { dist : { src : 'asserts/js/*.js', dest : 'asserts/js/myApp.js' } }, uglify : { dist : { src : '<%= concat.dist.dest %>', dest : 'public/js/myApp.min.js' } } }); … } gruntfile.js : grunt.loadNpmTasks('grunt-contrib-concat'); grunt.loadNpmTasks('grunt-contrib-concat'); grunt.registerTask('default', ['concat' , 'uglify' ]); grunt
5 – Conclusion … - Un Framework MVC efficace -
Nombreuses features out of the box - ORM adaptable - Développement de Backend in no time ! - Essayez le ! … le poulpe c’est bon, mangez en !
Merci… 26 Mars 2014 - Sup’Info Montparnasse - Sylvain PONTOREAU
… à tous et bon pot ! Source disponible sur GitHub ! https://github.com/Vtek/SailsDCubeExemple