上传文件时,快速会话中的数据消失

时间:2019-06-21 16:54:18

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

我正在开发Web服务器,并尝试进行上传文件路由。但我只需要登录的人才能上传文件。因此,我添加了中间件来检查会话数据是否可用。但是,在此路由中始终没有定义会话数据。

我试图重新加载并重新生成会话,但它仍未定义。我将库从“ 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的输出为存储用户数据的对象,但实际输出未定义。

3 个答案:

答案 0 :(得分:0)

使用multer时,会话会被覆盖,这也会在cls软件包中发生。

在调用multer实例时尝试添加Promise,并在解决后继续执行下一行。我认为这应该可以解决问题。

答案 1 :(得分:0)

您需要在一种途径中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 }

答案 2 :(得分:0)

我终于发现会话消失了,因为我忘记了随请求一起发送cookie。我正在使用Fetch API。因此,我将credentials: 'include'添加到标题中,然后它开始工作。谢谢。