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
The MEAN Stack
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Jeff Dickey
October 20, 2015
Technology
1
190
The MEAN Stack
All Things Open 2015
https://github.com/dickeyxxx/social-app
Jeff Dickey
October 20, 2015
Tweet
Share
Other Decks in Technology
See All in Technology
Kiro IDEのドキュメントを全部読んだので地味だけどちょっと嬉しい機能を紹介する
khmoryz
0
180
Codex 5.3 と Opus 4.6 にコーポレートサイトを作らせてみた / Codex 5.3 vs Opus 4.6
ama_ch
0
120
MCPでつなぐElasticsearchとLLM - 深夜の障害対応を楽にしたい / Bridging Elasticsearch and LLMs with MCP
sashimimochi
0
150
Bedrock PolicyでAmazon Bedrock Guardrails利用を強制してみた
yuu551
0
190
AWS Network Firewall Proxyを触ってみた
nagisa53
1
210
We Built for Predictability; The Workloads Didn’t Care
stahnma
0
140
All About Sansan – for New Global Engineers
sansan33
PRO
1
1.3k
今日から始めるAmazon Bedrock AgentCore
har1101
4
400
AIエージェントを開発しよう!-AgentCore活用の勘所-
yukiogawa
0
140
SREチームをどう作り、どう育てるか ― Findy横断SREのマネジメント
rvirus0817
0
130
SREが向き合う大規模リアーキテクチャ 〜信頼性とアジリティの両立〜
zepprix
0
440
Amazon S3 Vectorsを使って資格勉強用AIエージェントを構築してみた
usanchuu
3
450
Featured
See All Featured
Music & Morning Musume
bryan
47
7.1k
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
380
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
122
21k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
0
1.9k
It's Worth the Effort
3n
188
29k
The Art of Programming - Codeland 2020
erikaheidi
57
14k
Tell your own story through comics
letsgokoyo
1
810
Site-Speed That Sticks
csswizardry
13
1.1k
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
0
200
Design in an AI World
tapps
0
140
How GitHub (no longer) Works
holman
316
140k
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