【问题标题】:how to store session data in file in expressjs?如何将会话数据存储在expressjs的文件中?
【发布时间】:2014-04-02 13:24:19
【问题描述】:

当用户登录时,我会像这样在会话中存储数据:

   req.session.user = userData;

它工作正常,但是当我在 nodejs 中重新启动时,会话为空。然后用户需要重新登录。

我想为会话创建一个基于文件的存储。但是经过大量搜索后,我找到了将数据存储在数据库中的方法,但我不想将会话数据存储在数据库中。我想将数据存储在文件中。

是否有 nodejs 模块将会话数据存储在文件中?

【问题讨论】:

  • 文件系统不是存储会话数据的最佳位置。考虑使用一些快速的键值存储(例如Redis),或者至少是一个数据库(例如MongoDB)。

标签: node.js session express


【解决方案1】:

您可以使用session-file-store。可以参考下面的工作示例。

var express = require('express');
var app = express();
var session = require('express-session');
var FileStore = require('session-file-store')(session);

app.use(session({ secret: 'keyboard cat',
    resave: false,
    saveUninitialized: false,
    store: new FileStore,
    cookie: { maxAge: 3600000,secure: false, httpOnly: true }
  })
);

app.get('/', function (req, res) {
  if (req.session.views) {
    req.session.views++;
    res.setHeader('Content-Type', 'text/html');
    res.write('<p>views: ' + req.session.views + '</p>');
    res.end();
  } else {
    req.session.views = 1;
    res.end('Welcome to the file session demo. Refresh page!');
  }
});

var server = app.listen(3000, function () {
  var host = server.address().address;
  var port = server.address().port;

  console.log('Example app listening at http://%s:%s', host, port);
});

【讨论】:

    【解决方案2】:

    你可以试试connect-fs2

    var FSStore = require('connect-fs2')(express);
    var options = { dir='./mySessionFolder' }; // specify your directory to store your session files
    
    app.configure(function() {
      app.set('views', __dirname + '/views');
      app.set('view engine', 'jade');
      app.use(express.bodyParser());
      app.use(express.methodOverride());
      app.use(express.cookieParser());
      app.use(express.session({
        store: new FSStore(options), // use it as your store
        secret: 'your secret',
        cookie: { maxAge: 7 * 24 * 60 * 60 * 1000 } // 1 week
      }));
      app.use(app.router);
      app.use(express.static(__dirname + '/public'));
    });
    

    【讨论】:

    【解决方案3】:

    在文件中写入会话数据不是一个好主意,因为您需要将其存储为键、值对并且必须对其进行解析。如果用户注销,您需要从文件中删除特定会话(否则文件可能会耗尽内存)

    您说,您已将会话数据存储在 db 中,您需要在 db 中添加额外的状态信息作为键值对。只有当用户终止会话或会话超时时,该状态才应变为 false,否则即使服务器重新启动,它仍保持为 true。参考此状态,您可以保留用户。

    【讨论】:

    • 这不是答案
    • 它有一些用例:例如:在开发中我不想启动数据库,但想在服务器重新加载时保持会话。
    猜你喜欢
    • 2012-07-22
    • 2023-04-10
    • 1970-01-01
    • 2014-06-03
    • 1970-01-01
    • 1970-01-01
    • 2021-05-31
    • 2011-06-09
    • 2021-10-23
    相关资源
    最近更新 更多