/
index.js
149 lines (116 loc) · 2.96 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
var express = require('../..')
, User = require('./user')
, app = express();
app.set('views', __dirname);
app.set('view engine', 'jade');
// filter ferrets only
function ferrets(user) {
return user.species == 'ferret';
}
// naive nesting approach,
// delegating errors to next(err)
// in order to expose the "count"
// and "users" locals
app.get('/', function(req, res, next){
User.count(function(err, count){
if (err) return next(err);
User.all(function(err, users){
if (err) return next(err);
res.render('user', {
title: 'Users',
count: count,
users: users.filter(ferrets)
});
})
})
});
// this approach is cleaner,
// less nesting and we have
// the variables available
// on the request object
function count(req, res, next) {
User.count(function(err, count){
if (err) return next(err);
req.count = count;
next();
})
}
function users(req, res, next) {
User.all(function(err, users){
if (err) return next(err);
req.users = users;
next();
})
}
app.get('/middleware', count, users, function(req, res, next){
res.render('user', {
title: 'Users',
count: req.count,
users: req.users.filter(ferrets)
});
});
// this approach is much like the last
// however we're explicitly exposing
// the locals within each middleware
//
// note that this may not always work
// well, for example here we filter
// the users in the middleware, which
// may not be ideal for our application.
// so in that sense the previous example
// is more flexible with `req.users`.
function count2(req, res, next) {
User.count(function(err, count){
if (err) return next(err);
res.locals.count = count;
next();
})
}
function users2(req, res, next) {
User.all(function(err, users){
if (err) return next(err);
res.locals.users = users.filter(ferrets);
next();
})
}
app.get('/middleware-locals', count2, users2, function(req, res, next){
// you can see now how we have much less
// to pass to res.render(). If we have
// several routes related to users this
// can be a great productivity booster
res.render('user', { title: 'Users' });
});
// keep in mind that middleware may be placed anywhere
// and in various combinations, so if you have locals
// that you wish to make available to all subsequent
// middleware/routes you can do something like this:
/*
app.use(function(req, res, next){
res.locals.user = req.user;
res.locals.sess = req.session;
next();
});
*/
// or suppose you have some /admin
// "global" local variables:
/*
app.use('/api', function(req, res, next){
res.locals.user = req.user;
res.locals.sess = req.session;
next();
});
*/
// the following is effectively the same,
// but uses a route instead:
/*
app.all('/api/*', function(req, res, next){
res.locals.user = req.user;
res.locals.sess = req.session;
next();
});
*/
/* istanbul ignore next */
if (!module.parent) {
app.listen(3000);
console.log('Express started on port 3000');
}