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
Sylvain PONTOREAU
March 26, 2014
Technology
0
100
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
17
TypeScript - 45 minutes pour s’y mettre !
spontoreau
0
120
Event Sourcing avec Azure, quelle base de données choisir
spontoreau
0
36
Decorators in TypeScript 5.0, everything you need to know!
spontoreau
0
410
Leverage your CI/CD at the next level with Github actions
spontoreau
0
13
Commit comme un(e) "Hipster" avec Gitmoji !
spontoreau
0
110
Bird of a Feather - TypeScript (Devoxx 2022)
spontoreau
0
18
GitHub - Du besoin jusqu'à la production avec Github et Azure
spontoreau
0
20
Behavior Driven Development
spontoreau
1
210
Other Decks in Technology
See All in Technology
組織に自動テストを書く文化を根付かせる戦略(2024冬版) / Building Automated Test Culture 2024 Winter Edition
twada
PRO
18
5.5k
私なりのAIのご紹介 [2024年版]
qt_luigi
1
120
エンジニアカフェ忘年会2024「今年やらかしてしまったこと!」
keropiyo
0
100
生成AIをより賢く エンジニアのための RAG入門 - Oracle AI Jam Session #20
kutsushitaneko
4
290
TypeScript開発にモジュラーモノリスを持ち込む
sansantech
PRO
2
650
いまからでも遅くないコンテナ座学
nomu
0
130
3年でバックエンドエンジニアが5倍に増えても破綻しなかったアーキテクチャ そして、これから / Software architecture that scales even with a 5x increase in backend engineers in 3 years
euglena1215
9
3.5k
TSKaigi 2024 の登壇から広がったコミュニティ活動について
tsukuha
0
170
小学3年生夏休みの自由研究「夏休みに Copilot で遊んでみた」
taichinakamura
0
180
多様なメトリックとシステムの健全性維持
masaaki_k
0
120
新機能VPCリソースエンドポイント機能検証から得られた考察
duelist2020jp
0
230
怖くない!ゼロから始めるPHPソースコードコンパイル入門
colopl
0
160
Featured
See All Featured
Bash Introduction
62gerente
609
210k
Building an army of robots
kneath
302
44k
Faster Mobile Websites
deanohume
305
30k
The Art of Programming - Codeland 2020
erikaheidi
53
13k
Why Our Code Smells
bkeepers
PRO
335
57k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
28
9.1k
Six Lessons from altMBA
skipperchong
27
3.5k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
8
1.2k
Java REST API Framework Comparison - PWX 2021
mraible
28
8.3k
How STYLIGHT went responsive
nonsquared
96
5.2k
Build your cross-platform service in a week with App Engine
jlugia
229
18k
RailsConf 2023
tenderlove
29
940
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