Node.js系统导航栏显用户信息:优化GET请求重复查询方案问询
优化Node.js中重复查询用户信息的方案
嘿,我太懂你这种重复写相同代码的烦躁感了——每次处理GET请求都要查一遍session里的用户,代码冗余不说,后期维护也麻烦。咱们可以用自定义中间件来彻底解决这个问题,把查询用户的逻辑抽出来,让它自动在请求流程中执行,这样路由和视图都能直接用用户信息,不用再重复写查询啦!
第一步:创建全局用户信息中间件
先新建一个中间件文件(比如middleware/auth.js),把查询用户的逻辑放到这里:
const User = require('../models/User'); // 替换成你的User模型实际路径 module.exports = (req, res, next) => { // 检查session中是否存在用户ID if (req.session.userId) { User.findById(req.session.userId) .exec((error, user) => { if (error) { return next(error); // 把错误传给错误处理中间件 } // 把用户信息挂载到req对象,供路由使用 req.currentUser = user; // 把用户信息放到res.locals,EJS视图可以直接访问,不用手动传参 res.locals.user = user; next(); // 继续执行后续路由逻辑 }); } else { // 如果未登录,给locals设置空值,避免视图报错 res.locals.user = null; next(); } };
第二步:注册中间件到全局
在你的app.js(或者入口文件)里,把这个中间件注册到session中间件之后、路由之前:
const express = require('express'); const app = express(); const authMiddleware = require('./middleware/auth'); const session = require('express-session'); // 假设你用了express-session // 先注册session中间件(必须在auth中间件之前) app.use(session({ secret: 'your-secret-key', resave: false, saveUninitialized: false })); // 注册用户信息中间件,对所有路由生效 app.use(authMiddleware); // 之后再注册你的路由 app.use('/', require('./routes'));
第三步:简化你的路由代码
现在你可以删掉每个路由里重复的用户查询逻辑了,直接用中间件准备好的信息:
// 优化后的/admin_user路由 router.get('/admin_user', mid, function(req, res){ // req.currentUser 就是当前登录用户,需要的话可以直接用 User.find({}, function(err, users){ if (err) throw err; // 不用再传user参数到视图!res.locals.user已经自动传给EJS了 res.render('admin_content/admin_user', {'users': users}); }); });
第四步:视图无需修改
你原来的侧边栏和Dashboard视图里的<%= user.name %>、<%= user.roles %>完全不用改,因为res.locals.user已经自动把用户信息注入到所有视图中了,直接就能用。
为什么这是更优方案?
- 代码复用:把重复的查询逻辑集中到一处,后期要修改用户信息的返回字段或者查询条件,只需要改中间件就行
- 路由更简洁:每个路由只需要专注处理自己的业务逻辑,不用再关心用户信息的获取
- 视图自动注入:不用在每个
res.render里手动传user参数,减少遗漏的可能
小提醒
- 确保auth中间件在session中间件之后注册,否则
req.session.userId会拿不到值 - 如果有不需要用户信息的路由(比如登录页、注册页),可以给中间件加判断跳过,或者单独给这些路由不使用该中间件
内容的提问来源于stack exchange,提问作者Taqiuddin Shokordey
相关产品推荐
相关产品推荐

