代码之家  ›  专栏  ›  技术社区  ›  DethoRhyne

“EPERM:对会话文件存储使用express session时不允许操作,重命名”

  •  0
  • DethoRhyne  · 技术社区  · 6 年前

    我正在创建一个运行在 express Web服务器 express-session session-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'
    

    不管出现什么错误,一切似乎都正常(在窗口/浏览器按预期关闭后会话仍然存在,等等),但是这些错误使从服务器正确调试输出变得非常困难,因为它们一直在重复。

    我到处寻找解决方案,尝试降低模块的级别,通过管理PowerShell以管理员和独立应用程序的身份运行VS代码,检查文件夹上的文件权限,以便所有人和所有人都可以读/写,但错误仍在显示。另外,我在网上看到的很多类似的错误都显示了同样的错误,但是没有 会话文件存储 表达 完全。

    //...
    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
    }))
    

    谢谢你在这件事上的帮助!

    0 回复  |  直到 6 年前
        1
  •  0
  •   hispeed    6 年前

    我也有同样的问题,我也浏览了SO和相关网站。我通过查阅和阅读文档解决了这个问题。

    您必须将静态文件保存在中间件堆栈顶部的express中。它刚好在帕格的下面,比其他的都要早。

    示例-

    /**
     * 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

    推荐文章