断开连接事件时有时会丢失会话数据

twh00eeo  于 2021-09-13  发布在  Java
关注(0)|答案(0)|浏览(181)

我正在开发一个小工具,用户可以上传他们的文件进行编辑。
服务器设置: node.js , express , express-session , connect-redis , socket.io .
由于文件占用大量空间,我提出了一个解决方案来防止遗留文件,解决方案是 socket.io ,当用户以任何方式离开时,我用 on('disconnect'... 我可以删除他上传的文件。
我遇到的问题是,在10次尝试中,有4次尝试时,会话数据显示为空 disconnect 事件被触发。
相关代码:

  1. // index.js
  2. let sessionMiddleware = session({
  3. store: new RedisStore({ client: redisClient, ttl: config.ttl }),
  4. secret: config.secret,
  5. saveUninitialized: true,
  6. resave: false,
  7. proxy: true,
  8. cookie: { secure: true },
  9. });
  10. app.set("trust proxy", 1);
  11. io.use((socket, next) => {
  12. sessionMiddleware(socket.request, socket.request.res || {}, next);
  13. });
  14. app.use(sessionMiddleware);
  15. // web route
  16. const storage = multer.diskStorage({
  17. filename: (req, file, cb) => {
  18. req.session.file = {
  19. name,
  20. ext,
  21. };
  22. console.log("STORAGE route accessed", req.sessionID, req.session);
  23. },
  24. });
  25. const handleUpload = multer({ storage: storage });
  26. const upload = (req, res, next) => {
  27. console.log("UPLOAD route accessed", req.sessionID, req.session);
  28. };
  29. router.post("/upload", handleUpload.array("files"), upload);
  30. // socket
  31. socket.on("disconnect", () => {
  32. const { sessionID } = socket.request;
  33. const { file } = socket.request.session;
  34. console.log("disconnect happened", sessionID, socket.request.session);
  35. console.log("disconnect file is", file);
  36. if (!file) {
  37. console.log("file doesnt exist");
  38. return false;
  39. }
  40. console.log("file exists and unlinking it");
  41. });

最后,我在完全相同的条件下进行了所有测试,打开应用程序,等待1分钟,上传文件,服务器确认文件上传后,等待1分钟,关闭选项卡。
可能的结果:

  1. disconnect happened CG-JDFffeJa0BGFyZauXw5016KTf7I0U Session {
  2. cookie: {
  3. path: '/',
  4. _expires: null,
  5. originalMaxAge: null,
  6. httpOnly: true,
  7. secure: true
  8. }
  9. }
  10. disconnect file is undefined
  11. file doesnt exist
  12. disconnect happened CG-JDFffeJa0BGFyZauXw5016KTf7I0U Session {
  13. cookie: {
  14. path: '/',
  15. _expires: null,
  16. originalMaxAge: null,
  17. httpOnly: true,
  18. secure: true
  19. },
  20. file: { name: 'module-bt5', ext: '.dat' }
  21. }
  22. disconnect file is { name: 'module-bt5', ext: '.dat' }
  23. file exists and unlinking it

乍一看,行为是随机的,有时有效,有时无效。我错过了什么来避免它?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题