Nodejs 关于nodeclub,下面的源码是不是存在性能问题
Nodejs 关于nodeclub,下面的源码是不是存在性能问题
app.use(require(’./controllers/sign’).auth_user); //在app.js 中引入此中间件 具体方法的定义如下(主要是获取未读消息) exports.auth_user = function (req, res, next) { console.log(req.path); if (req.session.user) { if (config.admins.hasOwnProperty(req.session.user.name)) { req.session.user.is_admin = true; } Message.getMessagesCount(req.session.user._id, function (err, count) { if (err) { return next(err); } req.session.user.messages_count = count; if (!req.session.user.avatar_url) { req.session.user.avatar_url = getAvatarURL(req.session.user); } res.local(‘current_user’, req.session.user); return next(); }); } else { var cookie = req.cookies[config.auth_cookie_name]; if (!cookie) { return next(); } var auth_token = decrypt(cookie, config.session_secret); var auth = auth_token.split(’\t’); var user_id = auth[0]; User.getUserById(user_id, function (err, user) { if (err) { return next(err); } if (user) { if (config.admins.hasOwnProperty(user.name)) { user.is_admin = true; } Message.getMessagesCount(user._id, function (err, count) { if (err) { return next(err); } user.messages_count = count; req.session.user = user; res.local(‘current_user’, req.session.user); return next(); }); } else { return next(); } }); } };
我在exports.auth_user 中console.log(req.path),结果输入地址,敲回车,要经过n次请求,包括所有的js和css 这是是存在性能问题么?
追加:刚看了一下把app.use(’/public’, express.static(staticDir));放在app.use(require(’./controllers/sign’).auth_user); 的前面就不会出现这个问题
Node.js 关于 nodeclub,下面的源码是否存在性能问题?
背景
你提到在使用 nodeclub
这个框架时,发现 exports.auth_user
方法中的一些操作导致了性能问题。具体表现为每次访问页面时,都会多次调用该中间件,包括加载静态资源如 JS 和 CSS 文件。
问题分析
从代码来看,exports.auth_user
是一个中间件函数,用于处理用户的认证和消息计数等逻辑。以下是代码的主要逻辑:
- 检查用户会话:首先检查是否有用户会话信息 (
req.session.user
)。 - 管理员权限检查:如果有会话信息,则检查用户是否为管理员。
- 获取消息计数:调用
Message.getMessagesCount
获取用户的未读消息数量,并将其存储在会话中。 - 设置用户头像:如果用户没有头像 URL,则生成一个默认头像。
- 返回响应:将当前用户信息存入本地变量并调用
next()
继续执行后续中间件。
性能问题分析
从你的描述来看,问题主要出现在每次请求都会触发该中间件,并且包括静态资源请求(如 JS 和 CSS 文件),这显然会导致不必要的性能开销。
解决方案
你可以通过调整中间件的顺序来解决这个问题。具体来说,将静态资源中间件放置在认证中间件之前,这样静态资源请求就不会被认证中间件处理。
// 将静态资源中间件放置在认证中间件之前
app.use('/public', express.static(staticDir));
app.use(require('./controllers/sign').auth_user);
示例代码
以下是调整后的代码片段:
const express = require('express');
const app = express();
// 静态资源中间件
const staticDir = path.join(__dirname, 'public');
app.use('/public', express.static(staticDir));
// 认证中间件
app.use(require('./controllers/sign').auth_user);
// 其他中间件和路由配置
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
// 路由配置
app.get('/', (req, res) => {
res.send('Hello World!');
});
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
总结
通过调整中间件的顺序,可以避免静态资源请求被认证中间件处理,从而减少不必要的性能开销。这不仅提高了应用的性能,也提升了用户体验。希望这个解决方案对你有所帮助。
啥中间件?不就是个库么?
你加到前面去干嘛呢。
根据你提供的代码片段和描述,可以确认这段代码确实存在一些潜在的性能问题。主要问题包括:
-
日志记录:
console.log(req.path);
这段代码会每次请求都打印日志,如果请求量大,会导致大量日志输出,可能会影响性能。
-
数据库查询:
Message.getMessagesCount(req.session.user._id, function (err, count) { ... });
这段代码在每次请求时都会去数据库中查询用户的消息计数,这可能会导致数据库负载过大。
-
重复执行: 你的追加信息表明,当将静态资源的中间件放在前面时,该问题不再出现。这是因为当前的中间件在处理静态文件时也会被执行,增加了不必要的开销。
改进建议
-
减少不必要的日志记录: 可以考虑只在开发环境中输出日志:
if (process.env.NODE_ENV !== 'production') { console.log(req.path); }
-
优化数据库查询:
- 只在需要的时候才进行数据库查询。
- 考虑使用缓存机制来减少对数据库的频繁访问。
-
调整中间件顺序: 确保静态资源中间件先执行,避免不必要的用户身份验证和数据库查询操作:
app.use('/public', express.static(staticDir)); app.use(require('./controllers/sign').auth_user);
通过以上改进,可以有效提升系统的性能。