be mean
DESCRIPTION
Construindo sistemas com MongoDb, Express, AngularJs e Node.js. Palestra ministrada no TDC São Paulo 2013. Trilha Javascript.TRANSCRIPT
![Page 1: Be MEAN](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5557d665d8b42af2178b4dbd/html5/thumbnails/1.jpg)
Be MEAN
Criando aplicações com MongoDb, Express, AngularJs e Node.js
![Page 2: Be MEAN](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5557d665d8b42af2178b4dbd/html5/thumbnails/2.jpg)
github.com/suissaabout.me/suissa
@osuissa
![Page 3: Be MEAN](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5557d665d8b42af2178b4dbd/html5/thumbnails/3.jpg)
![Page 4: Be MEAN](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5557d665d8b42af2178b4dbd/html5/thumbnails/4.jpg)
![Page 5: Be MEAN](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5557d665d8b42af2178b4dbd/html5/thumbnails/5.jpg)
![Page 6: Be MEAN](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5557d665d8b42af2178b4dbd/html5/thumbnails/6.jpg)
![Page 7: Be MEAN](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5557d665d8b42af2178b4dbd/html5/thumbnails/7.jpg)
![Page 8: Be MEAN](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5557d665d8b42af2178b4dbd/html5/thumbnails/8.jpg)
C++JSON/BSON
ReplicaSharding
GridFSMap/Reduce
![Page 9: Be MEAN](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5557d665d8b42af2178b4dbd/html5/thumbnails/9.jpg)
![Page 10: Be MEAN](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5557d665d8b42af2178b4dbd/html5/thumbnails/10.jpg)
![Page 11: Be MEAN](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5557d665d8b42af2178b4dbd/html5/thumbnails/11.jpg)
![Page 12: Be MEAN](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5557d665d8b42af2178b4dbd/html5/thumbnails/12.jpg)
V8C/C++
I/O AsyncEvent Drive
![Page 13: Be MEAN](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5557d665d8b42af2178b4dbd/html5/thumbnails/13.jpg)
![Page 14: Be MEAN](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5557d665d8b42af2178b4dbd/html5/thumbnails/14.jpg)
![Page 15: Be MEAN](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5557d665d8b42af2178b4dbd/html5/thumbnails/15.jpg)
![Page 16: Be MEAN](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5557d665d8b42af2178b4dbd/html5/thumbnails/16.jpg)
MVCRoutes
TemplatesDirectives
Dependency InjectionTwo Way Data-binding
![Page 17: Be MEAN](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5557d665d8b42af2178b4dbd/html5/thumbnails/17.jpg)
![Page 18: Be MEAN](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5557d665d8b42af2178b4dbd/html5/thumbnails/18.jpg)
![Page 19: Be MEAN](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5557d665d8b42af2178b4dbd/html5/thumbnails/19.jpg)
![Page 20: Be MEAN](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5557d665d8b42af2178b4dbd/html5/thumbnails/20.jpg)
![Page 21: Be MEAN](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5557d665d8b42af2178b4dbd/html5/thumbnails/21.jpg)
![Page 22: Be MEAN](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5557d665d8b42af2178b4dbd/html5/thumbnails/22.jpg)
Organização dos arquivos
app.jspackage.jsonmodules/
db/public/routes/views/
![Page 23: Be MEAN](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5557d665d8b42af2178b4dbd/html5/thumbnails/23.jpg)
package.json{ "name": "application-name" , "version": "0.0.1" , "private": true , "dependencies": { "express": "3.0.0" , "jade": ">= 0.0.1" , "mongo": "*" , "mongoose": "*" }}
![Page 24: Be MEAN](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5557d665d8b42af2178b4dbd/html5/thumbnails/24.jpg)
app.js/**
* Module dependencies.
*/
var express = require('express'),
routes = require('./routes'),
api = require('./routes/api');
var app = module.exports = express();
![Page 25: Be MEAN](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5557d665d8b42af2178b4dbd/html5/thumbnails/25.jpg)
app.js// Configuration
app.configure(function(){
app.set('views', __dirname + '/views');
app.set('view engine', 'jade');
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(express.static(__dirname + '/public'));
app.use(app.router);
});
![Page 26: Be MEAN](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5557d665d8b42af2178b4dbd/html5/thumbnails/26.jpg)
app.jsapp.configure('development', function(){
app.use(express.errorHandler({ dumpExceptions: true,
showStack: true }));
});
app.configure('production', function(){
app.use(express.errorHandler());
});
![Page 27: Be MEAN](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5557d665d8b42af2178b4dbd/html5/thumbnails/27.jpg)
app.js// Routes
app.get('/', routes.index);
app.get('/user/:id, routes.user);
// JSON API
app.get('/api/user/:id, api.userGet);
app.post('/api/user, api.userPost);
app.put('/api/user, api.userPut);
app.delete('/api/user, api.userDelete);
// redireciona todas outras para o index
app.get('*', routes.index);
![Page 28: Be MEAN](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5557d665d8b42af2178b4dbd/html5/thumbnails/28.jpg)
app.js// Start server
app.listen(3000, function(){
console.log("Server rodando na porta 3000");
});
![Page 29: Be MEAN](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5557d665d8b42af2178b4dbd/html5/thumbnails/29.jpg)
routes/api.js/**
* Create user
*/
exports.userPost = function (req, res) {
var user = new User(req.body)
user.save(function (err) {
if (err) {
return res.render('users/signup', {
errors: utils.errors(err.errors),
user: user,
title: 'Sign up'
})
}
}
![Page 30: Be MEAN](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5557d665d8b42af2178b4dbd/html5/thumbnails/30.jpg)
routes/api.jsexports.userGet = function (req, res, next, id) {
User
.findOne({ _id : id })
.exec(function (err, user) {
if (err)
return next(err);
else
return user;
})
}
![Page 31: Be MEAN](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5557d665d8b42af2178b4dbd/html5/thumbnails/31.jpg)
public/js/myapp.js'use strict';
angular.module('myApp', ['myApp.filters', 'myApp.
services', 'myApp.directives']).
config(['$routeProvider', '$locationProvider', function
($routeProvider, $locationProvider) {
$routeProvider.when('/user, {templateUrl: 'user',
controller: AppCtrl});
$routeProvider.when('/user/:id, {templateUrl: 'user',
controller: AppCtrl});
$routeProvider.otherwise({redirectTo: '/});
$locationProvider.html5Mode(true);
}]);
![Page 32: Be MEAN](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5557d665d8b42af2178b4dbd/html5/thumbnails/32.jpg)
public/js/controllers.js'use strict';
/* Controllers */
function AppCtrl($scope, $http, $routeParams) {
var id = $routeParams.id;
$http({method: 'GET', url: '/api/user/'+id}).
success(function(data, status) {
$scope.name = data.name;
$scope.msg = 'Usuário encontrado.';
}).
error(function(data, status {
$scope.msg = 'Usuário não encontrado!';
});
}
![Page 33: Be MEAN](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5557d665d8b42af2178b4dbd/html5/thumbnails/33.jpg)
modules/db/user.js/**
* Module dependencies.
*/
var mongoose = require('mongoose')
, Schema = mongoose.Schema;
mongoose.connect('mongodb://localhost/database_name);
var db = mongoose.connection;
![Page 34: Be MEAN](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5557d665d8b42af2178b4dbd/html5/thumbnails/34.jpg)
modules/db/user.js/**
* User Schema
*/
var UserSchema = new Schema({
name: { type: String, default: '' },
email: { type: String, default: '', unique: true },
username: { type: String, default: '' },
hashed_password: { type: String, default: '' },
salt: { type: String, default: '' },
authToken: { type: String, default: '' },
});
mongoose.model('User', UserSchema);