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); 的前面就不会出现这个问题


4 回复

Node.js 关于 nodeclub,下面的源码是否存在性能问题?

背景

你提到在使用 nodeclub 这个框架时,发现 exports.auth_user 方法中的一些操作导致了性能问题。具体表现为每次访问页面时,都会多次调用该中间件,包括加载静态资源如 JS 和 CSS 文件。

问题分析

从代码来看,exports.auth_user 是一个中间件函数,用于处理用户的认证和消息计数等逻辑。以下是代码的主要逻辑:

  1. 检查用户会话:首先检查是否有用户会话信息 (req.session.user)。
  2. 管理员权限检查:如果有会话信息,则检查用户是否为管理员。
  3. 获取消息计数:调用 Message.getMessagesCount 获取用户的未读消息数量,并将其存储在会话中。
  4. 设置用户头像:如果用户没有头像 URL,则生成一个默认头像。
  5. 返回响应:将当前用户信息存入本地变量并调用 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');
});

总结

通过调整中间件的顺序,可以避免静态资源请求被认证中间件处理,从而减少不必要的性能开销。这不仅提高了应用的性能,也提升了用户体验。希望这个解决方案对你有所帮助。


啥中间件?不就是个库么?

你加到前面去干嘛呢。

根据你提供的代码片段和描述,可以确认这段代码确实存在一些潜在的性能问题。主要问题包括:

  1. 日志记录

    console.log(req.path);
    

    这段代码会每次请求都打印日志,如果请求量大,会导致大量日志输出,可能会影响性能。

  2. 数据库查询

    Message.getMessagesCount(req.session.user._id, function (err, count) { ... });
    

    这段代码在每次请求时都会去数据库中查询用户的消息计数,这可能会导致数据库负载过大。

  3. 重复执行: 你的追加信息表明,当将静态资源的中间件放在前面时,该问题不再出现。这是因为当前的中间件在处理静态文件时也会被执行,增加了不必要的开销。

改进建议

  1. 减少不必要的日志记录: 可以考虑只在开发环境中输出日志:

    if (process.env.NODE_ENV !== 'production') {
        console.log(req.path);
    }
    
  2. 优化数据库查询

    • 只在需要的时候才进行数据库查询。
    • 考虑使用缓存机制来减少对数据库的频繁访问。
  3. 调整中间件顺序: 确保静态资源中间件先执行,避免不必要的用户身份验证和数据库查询操作:

    app.use('/public', express.static(staticDir));
    app.use(require('./controllers/sign').auth_user);
    

通过以上改进,可以有效提升系统的性能。

回到顶部