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
Jeff Dickey
October 20, 2015
Technology
1
180
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
mrubyと micro-ROSが繋ぐロボットの世界
kishima
2
230
MySQL5.6から8.4へ 戦いの記録
kyoshidaxx
1
200
Agentic Workflowという選択肢を考える
tkikuchi1002
1
490
GitHub Copilot の概要
tomokusaba
1
130
GeminiとNotebookLMによる金融実務の業務革新
abenben
0
230
LinkX_GitHubを基点にした_AI時代のプロジェクトマネジメント.pdf
iotcomjpadmin
0
170
強化されたAmazon Location Serviceによる新機能と開発者体験
dayjournal
2
210
フィンテック養成勉強会#54
finengine
0
170
Snowflake Summit 2025 データエンジニアリング関連新機能紹介 / Snowflake Summit 2025 What's New about Data Engineering
tiltmax3
0
310
Observability в PHP без боли. Олег Мифле, тимлид Altenar
lamodatech
0
340
より良いプロダクトの開発を目指して - 情報を中心としたプロダクト開発 #phpcon #phpcon2025
bengo4com
1
3.1k
OpenHands🤲にContributeしてみた
kotauchisunsun
1
430
Featured
See All Featured
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
657
60k
Building Applications with DynamoDB
mza
95
6.5k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
252
21k
We Have a Design System, Now What?
morganepeng
53
7.7k
VelocityConf: Rendering Performance Case Studies
addyosmani
330
24k
Making the Leap to Tech Lead
cromwellryan
134
9.3k
Balancing Empowerment & Direction
lara
1
370
[RailsConf 2023] Rails as a piece of cake
palkan
55
5.6k
Making Projects Easy
brettharned
116
6.3k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
29
9.5k
Thoughts on Productivity
jonyablonski
69
4.7k
How to train your dragon (web standard)
notwaldorf
93
6.1k
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