【问题标题】:Store a session only after a specific condition仅在特定条件后存储会话
【发布时间】:2014-10-07 00:25:36
【问题描述】:

如果我执行 db.sessions.find({}) 我们找到了一条记录,即使您确实执行了 next() 方法。

我需要仅在必要时创建数据库(会话存储)中的记录,并且不会出现新请求。我想在特定条件为真后将任何信息存储在 mongodb 中。 我需要仅在必要时创建数据库中的记录。

我创建了一个会话存储,我会像中间件一样使用它:

var sessionStore = express.session({
    store: new MongoStore({
      url: 'mongodb://localhost:27017/3xam9l3'
    }),
    secret: '1234567890QWERTY'
});

当我想使用会话时,我会这样做:

app.get('/home', sessionStore, function(req, res) {
 ...
}

这是怎么做到的?

[]的

【问题讨论】:

  • 首先,这似乎是过早的优化。它的原因是什么?其次,似乎是stackoverflow.com/questions/15877342/…的副本
  • @FelipeLeusin 不存在创建 I/O 循环的理由。是不必要的。我达成了一个临时解决方案。无论如何,会话将在内存中创建,但只有在会话的特定属性确实创建时才会存储。请参阅github.com/alvieirajr/connect-mongo/blob/master/lib/…(第 247-249 行)
  • @FelipeLeusin 现在清楚了吗?
  • 不是真的,但如果它适合你,那就最好了。你检查过我发布的问题吗?
  • 我看到了另一篇文章,但它只显示了我们必须如何使用像中间件这样的会话存储(初始化会话中间件并直接指定你想要会话的路由)。我已经这样做了。我的问题是条件商店会话,而不是必须创建或使用会话时。

标签: node.js mongodb session


【解决方案1】:

我不太确定我是否理解你的问题,但我的答案来了。 在应用中我们可以使用这个:

app.use(session({secret: config.session.secret, saveUninitialized: true, resave: true}));

在中间件中你可以使用这样的条件:

var sessionStore = function(req, res, next){
   if (validate()){
     req.userName = "Jhon";
   }
   else{
     //do something else
   }
   next();
}

因此,如果 validate() 为 true,则您创建一个可变会话,否则您执行其他操作。

【讨论】:

  • 谢谢,但不是这个。如果你进入 mongodb,你会发现在“会话”中创建了一条记录,即使你确实执行了 next() 方法。我需要仅在必要时创建数据库中的记录。
【解决方案2】:

我找到了一个临时解决方案。无论如何,会话将在内存中创建,但只有在会话的特定属性确实创建时才会存储。

https://github.com/alvieirajr/connect-mongo/blob/master/lib/connect-mongo.js#L247

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-04
    • 1970-01-01
    • 2021-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-26
    • 1970-01-01
    相关资源
    最近更新 更多