【问题标题】:express session store user agent快速会话存储用户代理
【发布时间】:2014-10-14 08:22:10
【问题描述】:

我在我的节点 js/express js 网站中成功设置了会话管理。我将会话数据存储在 mongo db 中。我希望会话对登录几周的用户有效。代码如下:

var cookieParser = require('cookie-parser');
var session = require('express-session');
var MongoStore = require('connect-mongo')(session);
app.use(cookieParser());
app.use(session({
    store: new MongoStore({ mongoose_connection: db }),
    secret: 'cookie_secret',
    cookie: { maxAge: null }
}));

对于普通用户来说它工作得很好,但我的问题是网络爬虫,如谷歌机器人和 Facebook 机器人。我仍然希望他们抓取我的网站,但我不希望他们的会话存储在我的 mongo db 中。它占用了大量空间,而且存储空间每天都在增加,这让我花钱。

如何有选择地选择将哪些会话存储在数据库中。我可以检查req.headers['user-agent'],但是在我的代码中哪里使用它?如何告诉 express-session 有时不要存储会话?

【问题讨论】:

    标签: node.js session express web-crawler


    【解决方案1】:

    您可以根据User-Agent 标头有条件地使用会话中间件。一个简单的例子:

    var sessionMiddleware = require('express-session')({
      ...configuration here...
    });
    
    app.use(function(req, res, next) {
      var ua = req.get('user-agent');
      // If the User-Agent header contains the string "Googlebot",
      // skip the session middleware.
      if (/Googlebot/.test(ua)) {
        req.session = {}; // perhaps a bit too simple?
        return next();
      }
      return sessionMiddleware(req, res, next);
    });
    

    这将取决于您对req.session 的实际使用,如果上面的代码有效,或者您是否需要更好地模拟req.session(例如,如果您在代码中使用任何req.session 方法, 你可能也需要模拟这些)。

    【讨论】:

    • 这是一个非常聪明的方法来处理这个问题,在我的 sn-ps 中是正确的。我可以建议将 TTL 设置为 60 秒,以便会话可用,但很快就会消失吗?
    • @xShirase 我不确定这是否可能。 TTL 在express-session 的配置中设置,系统范围也是如此。我不认为你可以为一个特定的会话覆盖它(以一种有用的方式)。
    猜你喜欢
    • 2016-07-06
    • 2022-01-26
    • 1970-01-01
    • 2021-06-01
    • 2012-05-03
    • 2012-12-11
    • 2016-10-21
    • 2017-01-07
    • 2021-03-19
    相关资源
    最近更新 更多