【问题标题】:Data in express session disappear when upload file上传文件时快速会话中的数据消失
【发布时间】:2019-11-04 13:13:44
【问题描述】:

我正在开发一个网络服务器并尝试制作上传文件路由。但我只需要登录的人可以上传文件。所以我添加了检查会话数据是否可用的中间件。但是这个路由中的会话数据总是未定义的。

我尝试重新加载并重新生成会话,但它仍然未定义。我将库从“multer”更改为“express-fileupload”,但没有效果。可能是因为内容的类型是 multipart-form-data。我不确定。

会话中间件设置。

const sessionMidleware = session({
  secret: 'My secret key',
  resave: false,
  saveUninitialized: false,
})

app.use(sessionMidleware)

我插入用于调试的中间件。

app.post(
  '/sendinvoice',
  (req, res, next) => {
    console.log(req.session)
    next()
  },
  uploadCustomerInvoice().fields([
    { name: 'file', maxCount: 1 },
    { name: 'course_id', maxCount: 1 },
  ]),
  customerInvoice,
)

这是我在登录和注册时用于在其他路由中设置会话的功能。

module.exports = (req, profile, courses) => {
  req.session.profile = profile
  req.session.courses = courses
  req.session.isSuper = false
  req.session.isAdmin = false
  req.session.save()
}

我希望 req.session.profile 的输出为存储用户数据的对象,但实际输出未定义。

【问题讨论】:

  • 你在哪里设置会话?
  • 文件顶部

标签: javascript node.js express multer express-session


【解决方案1】:

我终于发现会话消失了,因为我忘记将 cookie 与请求一起发送。我正在使用获取 API。所以我将credentials: 'include' 添加到标题然后它工作。谢谢。

【讨论】:

    【解决方案2】:

    使用 multer 时会话被覆盖,cls 包也会发生这种情况。

    尝试在调用 multer instance 时添加一个承诺,并在解决时继续执行下一行。我认为这应该可以解决问题。

    【讨论】:

    • 对不起,我不明白 multer 实例是什么。我的英语不好。你是说uploadCustomerInvoice函数吗?
    • 这将类似于``` var upload = multer(object);对此添加一个承诺
    【解决方案3】:

    您需要在一个路由中SET 一个会话密钥才能在另一个路由中使用它。例如登录。

    1. 您登录,会话已设置。用于以后验证用户。
    2. 每条需要认证的路由都需要检查会话密钥是否存在。
    3. 如果存在,继续。否则,它不会。

    所以在你的情况下,

    app.post('/login', (req,res) =>{
        //here check if logged in
        if(login){
            // Set the session
            req.session.someKey = someDataToVerifyUser;
        }
    })
    
    app.post('/upload', (req,res,next)=>{
        if(req.session.someKey && someVerification(req.session.someKey)){
            next();
        }else{
            res.status(400).send('Not Authorized')
        }
    }, ..multer..., (req,res)=> {...})
    

    编辑:
    您可以使用passport-js 使注册和登录变得无缝。

    EDIT2: 我做了一个最小的例子,看看它是否有帮助:

    const express = require('express');
    const app = express();
    var router = express.Router()
    const session = require('express-session');
    var multer = require('multer')
    
    var upload = multer({ dest: './uploads/' })
    
    var sess = {
        secret: 'mySecret',
        cookie: { token: null },
        saveUninitialized: false,
        resave: true
    };
    
    app.use(session(sess));
    
    app.get('/', async (req, res) => {
        console.log("Hit The GET /:")
        req.session.token = 'hello';
        console.log("Setting the session:"+req.session.token+"\n"); // Outputs 'hello'
        res.send(req.session.token);
    });
    app.get('/me', async (req, res) => {
        console.log("Hit The GET /me:")
        console.log(`Printing the Session: ${req.session.token}\n`);
        res.send(req.session.token);
    });
    app.post('/', (req, res, next) => {
            console.log("Hit The POST /me:")
            console.log(`THERE IT IS ${req.session.token}\n`);
            next()
        },
        upload.single('avatar'),
        function (req, res, next) {
            console.dir(req.file);
            res.json(req.file)
        })
    
    app.listen(8888, () => {
        console.log('Server Running At: 8888');
    })
    

    这是控制台输出:

    Server Running At: 8888
    Hit The GET /:
    Setting the session:hello
    
    Hit The GET /me:
    Printing the Session: hello
    
    Hit The POST /me:
    THERE IT IS hello
    
    { fieldname: 'avatar',
      originalname: '304.png',
      encoding: '7bit',
      mimetype: 'image/png',
      destination: './uploads/',
      filename: '340cae7033576062253339d04519ed8a',
      path: 'uploads/340cae7033576062253339d04519ed8a',
      size: 4093 }
    

    【讨论】:

    • 感谢您的回答。但是我已经有两条设置 req.session.profile 的路由。在帖子中,我只是通过中间件进行调试。
    • 将极简版本的路由添加到问题中,这就是为什么我问你在哪里设置会话。
    • 好的,我会把它添加到我的帖子中。
    • 刚刚添加的功能使用情况如何?
    • 我只是在登录路径中像这样调用它,它就可以工作了。 addUserSession(req, result.profile, result.courses, false)
    猜你喜欢
    • 2018-12-01
    • 2021-10-22
    • 2012-05-31
    • 2014-06-14
    • 1970-01-01
    • 2022-07-19
    • 2011-02-22
    • 2012-01-22
    • 2019-03-14
    相关资源
    最近更新 更多