Use let or const to avoid scope issues and hoisting
var express = require('../..');
1'use strict'23/**4 * Module dependencies.5 */67var express = require('../..');8var path = require('node:path');9var User = require('./user');10var app = express();1112app.set('views', path.join(__dirname, 'views'));13app.set('view engine', 'ejs');1415// filter ferrets only1617function ferrets(user) {18 return user.species === 'ferret'19}2021// naive nesting approach,22// delegating errors to next(err)23// in order to expose the "count"24// and "users" locals2526app.get('/', function(req, res, next){27 User.count(function(err, count){28 if (err) return next(err);29 User.all(function(err, users){30 if (err) return next(err);31 res.render('index', {32 title: 'Users',33 count: count,34 users: users.filter(ferrets)35 });36 })37 })38});3940414243// this approach is cleaner,44// less nesting and we have45// the variables available46// on the request object4748function count(req, res, next) {49 User.count(function(err, count){50 if (err) return next(err);51 req.count = count;52 next();53 })54}5556function users(req, res, next) {57 User.all(function(err, users){58 if (err) return next(err);59 req.users = users;60 next();61 })62}6364app.get('/middleware', count, users, function (req, res) {65 res.render('index', {66 title: 'Users',67 count: req.count,68 users: req.users.filter(ferrets)69 });70});7172737475// this approach is much like the last76// however we're explicitly exposing77// the locals within each middleware78//79// note that this may not always work80// well, for example here we filter81// the users in the middleware, which82// may not be ideal for our application.83// so in that sense the previous example84// is more flexible with `req.users`.8586function count2(req, res, next) {87 User.count(function(err, count){88 if (err) return next(err);89 res.locals.count = count;90 next();91 })92}9394function users2(req, res, next) {95 User.all(function(err, users){96 if (err) return next(err);97 res.locals.users = users.filter(ferrets);98 next();99 })100}101102app.get('/middleware-locals', count2, users2, function (req, res) {103 // you can see now how we have much less104 // to pass to res.render(). If we have105 // several routes related to users this106 // can be a great productivity booster107 res.render('index', { title: 'Users' });108});109110// keep in mind that middleware may be placed anywhere111// and in various combinations, so if you have locals112// that you wish to make available to all subsequent113// middleware/routes you can do something like this:114115/*116117app.use(function(req, res, next){118 res.locals.user = req.user;119 res.locals.sess = req.session;120 next();121});122123*/124125// or suppose you have some /admin126// "global" local variables:127128/*129130app.use('/api', function(req, res, next){131 res.locals.user = req.user;132 res.locals.sess = req.session;133 next();134});135136*/137138// the following is effectively the same,139// but uses a route instead:140141/*142143app.all('/api/*', function(req, res, next){144 res.locals.user = req.user;145 res.locals.sess = req.session;146 next();147});148149*/150151/* istanbul ignore next */152if (!module.parent) {153 app.listen(3000);154 console.log('Express started on port 3000');155}
Same data, no extra tab — call code_get_file + code_get_findings over MCP from Claude/Cursor/Copilot.