将快速会话与会话文件存储

时间:2019-09-01 12:25:55

标签: node.js express session express-session

我正在创建一个在express网络服务器上运行的节点应用程序,并使用express-sessionsession-file-store进行会话管理。

自从我将其包含在项目中以来,我的调试控制台就充满了诸如以下错误:

Error: EPERM: operation not permitted, rename 'd:\nodejs\project\sessions\924bcb22-dd42-47d1-a790-91ea14fe4cf1.json.3130939431' -> 'd:\nodejs\project\sessions\924bcb22-dd42-47d1-a790-91ea14fe4cf1.json'

不管出现什么错误,一切似乎都处于工作状态(会话在窗口/浏览器按预期关闭后仍然存在,依此类推),但是这些错误使得很难正确调试服务器的输出,因为它们不断重复。

我一直在寻找解决方案,尝试降级模块,通过Administrator PowerShell以管理员身份和独立应用程序的身份运行VS Code,检查文件夹上的文件权限,以便所有人和所有人都可以读取/写入,但错误仍然存​​在显示。此外,我在互联网上看到的许多类似错误都显示相同的错误,但session-file-store一无所有,有些甚至根本不使用express

在有用的情况下,以下是app.js的摘要,它可能有助于解决此问题:

//...
const express               = require('express');
const session               = require('express-session');
const FileStore             = require('session-file-store')(session);


const http                  = require('http');
const path                  = require('path');
const socketio              = require('socket.io');
const bodyParser            = require('body-parser');

const app                   = express();
const server                = http.createServer(app);
global.io                   = socketio(server);
const port                  = process.env.PORT || 453;

//...

app.use(session({
  genid: (req) => {
    return global.uuid()
  },
  store: new FileStore(),
  secret: 'NotReallyMySecretKey',
  resave: false,
  saveUninitialized: true
}))

请注意,我在此处也查看了很多答案,即使它们的名称相似,我也没有发现它们之间的相似之处,因此请在将问题标记为重复项之前进行检查

谢谢您的协助!

1 个答案:

答案 0 :(得分:0)

我也遇到了同样的问题,我也浏览了SO和相关站点。在阅读并阅读文档后,我解决了这个问题。

对于我来说,共享静态文件时,它将初始化会话,并且由于某种原因,它将失败并导致该错误。我也遇到了无法写标题错误。

您必须在中间件堆栈的顶部保留静态文件的明确名称。它刚好在哈巴狗之下,然后才是其他一切。

示例-

/**
 * Add views
 */
app.set("views",path.join(__dirname,"views"));
app.set("view engine","pug");

const myMiddlewares = [
//THIS HAS TO BE ON THE TOP.
express.static(path.join(__dirname, 'www')),
cookieParser("mySecret"),
session({
  store: new fileStore(fileStoreOptions),
  secret:"mySecret",
  resave : true,
  saveUninitialized: false
}),
bodyParser.urlencoded({ extended: true }),
bodyParser.json(),
upload.array(),
compression(),
passport.initialize(),
passport.session(),
flash()
];
app.use(myMiddlewares);

链接到文档 https://gist.github.com/joepie91/c0069ab0e0da40cc7b54b8c2203befe1