Данные в экспресс-сеансе исчезают при загрузке файла - PullRequest
0 голосов
/ 21 июня 2019

Я разрабатываю веб-сервер и пытаюсь сделать маршрут загрузки файла. Но мне нужны только те, кто залогинился, может загрузить файл. Поэтому я добавляю промежуточное ПО, которое проверяет, доступны ли данные сеанса. Но данные сеанса всегда неопределены в этом маршруте.

Я попытался перезагрузить и восстановить сеанс, но он все еще не определен. И я изменил библиотеку с «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 голосов
/ 21 июня 2019

Вам нужно 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)=> {...})

EDIT:
Вы можете использовать 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 }
0 голосов
/ 01 июля 2019

Я наконец понял, что сеанс исчез, потому что я забыл отправить куки с запросом.Я использую Fetch API.Поэтому я добавляю credentials: 'include' в шапку, тогда это работает.Спасибо.

0 голосов
/ 21 июня 2019

Сеансы переопределяются при использовании multer, это также будет происходить с пакетом cls.

Попробуйте добавить обещание, когда вы вызываете экземпляр multer, и при разрешении вы переходите к выполнению следующей строки.Я думаю, что это должно решить проблему.

...