Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
The MEAN Stack
Search
Jeff Dickey
October 20, 2015
Technology
210
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
The MEAN Stack
All Things Open 2015
https://github.com/dickeyxxx/social-app
Jeff Dickey
October 20, 2015
Other Decks in Technology
See All in Technology
USB PDを使ってスマホを労わりたい
raspython3
0
180
TinyGoでオブザーバビリティ?OpenTelemetryはTinyGoで使えるのか / Is OpenTelemetry available in TinyGo environment?
ymotongpoo
2
140
Metadata - Section 1: HTML Basics
mohab1
0
120
Railsで挑む大量データ永続化 〜600億件を永続化するための設計とボトルネックとの戦い〜
occhi
1
580
オントロジーって 結局なにもの? AI エージェントに「意味」を渡す知識設計の話
greenmidori
0
210
Claude の新機能を、 出た日に触って社内に届けるまで
rfdnxbro
1
180
サブエージェントと Claude Mods で作る独自 Advisor ツールの話
kenichiodo
2
160
パスキーの自動テストはどこまでいけるのか
teamlab
PRO
0
250
Browser Spec: Testing Hotwire with Ruby
takahashim
1
120
"優秀な誰か"の下位互換にならないために
yut0naga1_fa
1
1.8k
日本語に強いオープンな大規模言語モデル「LLM-jp」
odashi
4
1.1k
実体験から学ぶ分析エージェントの開発と運⽤
recruitengineers
PRO
8
2.4k
Featured
See All Featured
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
550
Building Applications with DynamoDB
mza
96
7.2k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
1
570
The Cost Of JavaScript in 2023
addyosmani
55
10k
Rails Girls Zürich Keynote
gr2m
96
14k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.6k
Test your architecture with Archunit
thirion
2
2.4k
Speed Design
sergeychernyshev
33
2.2k
Believing is Seeing
oripsolob
1
240
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
640
Ethics towards AI in product and experience design
skipperchong
2
430
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
3
1.3k
Transcript
THE MEAN STACK JEFF DICKEY
None
THE MEAN STACK @DICKEYXXX ▸ github.com/dickeyxxx ▸ twitter.com/dickeyxxx ▸ medium.com/@dickeyxxx
None
THE MEAN STACK SOCIAL NETWORKING APP CREATE POSTS SEE POSTS
BY FOLLOWED USERS
TOOLS
THE MEAN STACK NODE.JS POWERFUL V8 ENGINE EVENTED IO BACK-TO-BASICS
CULTURE ES6 FEATURES IN NODE V4.X
THE MEAN STACK NPM
THE MEAN STACK EXPRESS.JS let express = require('express'); let app
= express(); app.get('/statuscheck', function (req, res) { res.json({status: 'success'}); }); app.listen(process.env.PORT || 3000);
THE MEAN STACK MONGODB
THE MEAN STACK ANGULARJS CLIENT DOM RENDERING FRONT-END SEPARATION MODULES
DEPENDENCY INJECTION
THE MEAN STACK ANGULARJS
None
CODE
BROWSER SERVER GET /api/posts [{body: ‘foo’…}]
THE MEAN STACK DATA MODEL USERS POSTS
THE MEAN STACK DATA MODEL USERS USERNAME (STRING) PASSWORD (STRING)
AVATAR_URL (STRING) FOLLOWINGS ([]ID) POSTS USER (ID) BODY (STRING)
THE MEAN STACK POST MONGOOSE DB SCHEMA let Post =
db.model('Post', { body: {type: String, required: true}, user: {type: db.Schema.ObjectId, required: true, ref: 'User'}, }); module.exports = Post;
THE MEAN STACK GET /API/POSTS RESPONSE JSON [ { "_id":"56250ece393a86f3e78e516b",
"body":"jeff's second post", "user": { "_id":"56250b0239c39309e6d8c7db", "avatarUrl":"//www.gravatar.com/avatar/…", "fullName":"Jeff Dickey", "email":"
[email protected]
", "username":"dickeyxxx", } }, {…}, {…} ]
THE MEAN STACK EXPRESS GET API HANDLER app.get('/api/posts', function (req,
res) { Post.find() .where('user').in(req.user.followings) .sort('-_id') .populate('user') .exec(function (err, posts) { res.json(posts); }); });
THE MEAN STACK ANGULAR CODE angular.module('app') .service('PostSvc', function ($http) {
this.fetch = function () { return $http.get('/api/posts'); }; }) .controller('FeedCtrl', function ($scope, PostSvc) { PostSvc.fetch() .then(function (posts) { $scope.posts = posts; }); });
THE MEAN STACK ANGULAR TEMPLATE <div ng-repeat="post in posts"> <img
ng-src="{{post.user.avatarUrl}}"/> <a ng-href="#/users/{{post.user.username}}"> {{post.user.fullName}} </a> {{post.body}} </div>
AUTHENTICATION
BROWSER SERVER POST /api/login eyJ0eXAiOiJKV… GET /api/posts [Auth-Token=‘eyJ0e…’]
None
None
THE MEAN STACK JWT let payload = { _id: user._id,
username: user.username, }; let token = jwt.sign(payload, 'mysecretkey'); token === 'eyJ0eXAiOiJKV1QiLCJhbG…'; jwt.verify(token, 'mysecretkey')._id === user._id; let jwt = require('jsonwebtoken');
THE MEAN STACK JWT WITH EXPRESS app.post('/api/login', function (req, res)
{ // get user, validate password with bcrypt res.send(jwt.sign(user, 'mysecretkey')); }); app.use(function (req, res, next) { let token = req.headers['Auth-Token']; req.user = jwt.verify(token, 'mysecretkey'); next(); });
None
JEFF SERVER POST /api/posts emit(‘POST’, {_id: [post_id]}) JOSE GET /api/posts/[post_id]
{id: [post_id], body: ‘…’}
THE MEAN STACK EVENTS CAPPED COLLECTION r.post('/api/posts', function (req, res)
{ // ... post.save(function (err, post) { let event = new Event({ type: 'Post', of: post._id, by: post.user }); event.save(); }); });
THE MEAN STACK TAILING CAPPED COLLECTION TO WEB SOCKET let
io = require('socket.io')(server); io.on('connection', function (socket) { }); let eventStream = Event.where(…) .tailable() .stream(); eventStream.on('data', function (event) { socket.emit(event.type, event); });
THE MEAN STACK RESPONDING TO WEBSOCKET EVENT IN ANGULAR .controller('FeedCtrl',
function (…) { WebSocketSvc.on('Post', function (post) { }); PostSvc.find(post.of) .then(function (post) { $scope.posts.push(post); });
None
THE MEAN STACK CHAT FEATURE let event = new Event({
type: 'ChatMessage', to: user, content: {body: 'hey buddy!'} });
THE MEAN STACK GEO NOTIFICATION // get gps coords in
browser let pos = navigator .geolocation.getCurrentPosition(); // in server let eventStream = Event .where('pos').near({ center: pos, maxDistance: 5, }).tailable().stream(); eventStream.on('data', function (event) { socket.emit(event.type, event); });
THE MEAN STACK FUNCTIONALITY ▸ Simple, scalable API ▸ Maintainable
front-end ▸ Push updates ▸ Geo notifications
THANKS! Jeff Dickey @dickeyxxx