Сеанс, созданный на маршруте, недоступен на других маршрутах - PullRequest
2 голосов
/ 05 октября 2019

Я пытаюсь настроить сеансы в моем приложении node.js. Для этого я использую модули «express», «express-session» и «express-mysql-session» для хранения их в базе данных на моем сервере. Мой код работает абсолютно нормально, пока я только получаю доступ к параметрам req.session внутри маршрута, в котором создается сеанс. На других маршрутах (или даже в файле запуска) созданные параметры генерируют неопределенную ошибку.

Я уже пытался создать app.use (session (...)) в файле запуска. Если я это сделаю, все будет работать нормально, а параметры, созданные на каком-либо маршруте, можно будет использовать и на других. Но так как я хочу, чтобы файл запуска был как можно меньше, эти строки кода должны обрабатываться в маршруте.

Вот мой код: login.js (маршрут)

var express = require('express');
var router = express.Router();
var session = require('express-session');
var MySQLStore = require('express-mysql-session');

var dbOptions = {
    host: "ip",
    user: "user",
    password: "pw",
    database: "some db"
};

var sessionStore = MySQLStore(dbOptions);

router.use(session({
    key: 'some key',
    secret: 'some secret',
    store: sessionStore,
    resave: false,
    saveUninitialized: false
}));

router.post('/login', (req, res) =>{
    req.session.username = req.body.username;
    res.end("done");
});

router.get('/sessionTest', (req, res) => {
    if(req.session.username) {
        res.write(`<h1>Hello ${req.session.username} </h1><br>`);
        res.end('<a href='+'/timetracking/logout'+'>Logout</a>');
    }
    else {
        res.write('<h1>Please login first.</h1>');
        res.end('<a href='+'/timetracking/login'+'>Login</a>');
    }
});

router.get('/logout',(req,res) => {
    req.session.destroy((err) => {
        if(err) {
            return console.log(err);
        }
        res.redirect('/timetracking/login');
    });

});

module.exports = router;

timetracking.js (файл запуска)

var http = require('http');
const express = require('express');
const app = express();
var gets = require('./lib/gets');
var login = require('./lib/login');
const session = require('express-session');


//Make '/timetracking/' to the standard handler for get requests
app.use('/timetracking', [gets, login]);

app.get('/test', (req, res) =>{
    res.send(req.session.username);
});

app.listen(80);

Когда я загружаю localhost / test, я все еще вижу cookie в инструментах веб-разработчика. Но "req.session.username" не определено.

Спасибо за помощь!

1 Ответ

1 голос
/ 11 октября 2019

req.session будет доступно только в маршрутах, которые происходят ПОСЛЕ выполнения промежуточного программного обеспечения сеанса (зависит от порядка). И, если промежуточное программное обеспечение сеанса находится только на одном маршрутизаторе, то это значение req.session будет доступно только в тех маршрутах, которые соответствуют этому маршрутизатору, и только после того, как этот маршрутизатор выполнит данный запрос.

Итак, если вы хотите, чтобы req.session действовал для всех ваших маршрутов, промежуточное программное обеспечение необходимо определить заранее и таким образом, чтобы промежуточное программное обеспечение работало на всех возможных маршрутах (на которых вы хотите его использовать), а нетолько в некоторых маршрутизаторах, которые работают только на некоторых путях.

Помните, что именно промежуточное программное обеспечение сеанса устанавливает req.session для любого входящего запроса. Он должен выполняться по заданному запросу, прежде чем вы захотите получить доступ к req.session.

. Вам не нужно напрямую вставлять промежуточное программное обеспечение сеанса в файл запуска. Вы все еще можете поместить его в свой собственный модуль, вам просто нужно загрузить этот модуль из файла запуска и передать ему объект app, чтобы он мог инициализировать глобальное промежуточное программное обеспечение перед любым из ваших маршрутов.

Вотпример файла запуска:

const express = require('express');
const app = express();

// initialize global middleware
require('./myMiddleware')(app);

// set up other routers and routes here
// and start the server

И файл myMiddlware.js:

// load and initialize session stuff
const session = ....;

module.exports = function(app) {
    // install session middleware
    app.use(session(...))
}
...