HapiJS Catbox:如何使用某些值的字段作为搜索条件来搜索密钥?

时间:2017-06-01 13:42:36

标签: caching hapijs

在我的应用程序中,当用户通过身份验证时,我会将他的会话数据(包括他的电子邮件)存储在服务器缓存中,然后创建一个我用作密钥的sessionId。

当从数据库中删除用户时,我想检查他是否已登录,也就是说,如果缓存中有来自其帐户的会话,那么我也可以从服务器缓存中删除该条目

问题是sessionId不是User模型的一部分,所以我必须使用他的电子邮件从缓存中查找他的条目,获取相关密钥,然后删除条目。这可能吗?

提前致谢。

2 个答案:

答案 0 :(得分:2)

Catbox只是一个键/值存储,看起来没有办法像你想要的那样遍历缓存项并通过其他属性查找用户。你需要知道钥匙。您可以将密钥设置为用户的电子邮件,也可以将sessionId存储在另一个表的数据库中。

您可能正在为会话管理做更多的工作。 Yar是一个hapi插件,可为您提供会话管理。 Invalidating a session也非常简单。

  

当用户退出时,使用yar.reset()清除会话。

Hapi-auth-cookie是另一个基于cookie的会话管理插件。

答案 1 :(得分:0)

我最终创建了一个 pre ,它返回与要删除的帐户关联的所有会话ID,因此我可以使用server.cache.drop(key, cb)正常删除它们。为简洁起见,删除了错误处理。

function currentSessionIds(request, reply) {
  const sessionIds = [];

  User.findOne({ _id: request.params.id }, (err, user) => {
    const cacheDB = request.server.app.sessionsCache._cache.connection.settings.partition;

    MongoClient.connect(`mongodb://host:port/${cacheDB}`, (err, db) => {
      db.collection('sessions').find({ 'value.account.email': user.email }, { _id: 1 }).toArray((err, sessions) => {   
        sessions.forEach(session => sessionIds.push(session._id));
        reply(sessionIds);
      });
    });
  });
}

但是当然这个解决方案太依赖于mongodb和catbox-mongodb策略存储数据的方式。如果他们改变它,我的功能就会失效。