Хранение сессий в express -ws с использованием express -session - PullRequest
1 голос
/ 18 июня 2020

Я пишу сценарий на стороне сервера, который имеет маршруты веб-сокетов с использованием express -ws, например:

/ init - который вызывается, когда веб-сайт загружается с помощью функции onload. В маршруте / init я настраиваю некоторую переменную сеанса

/ request - это вызывается, когда любой запрос делается к серверу, как при нажатии кнопки. Здесь я выполню некоторую внутреннюю обработку

Проблема в том, что идентификаторы сеансов одинаковы при вызове обоих маршрутов. Переменные сеанса, которые я инициализировал в маршруте / init , не могут быть найдены с запросом, сделанным для маршрута / request .

Ниже приведен код на стороне сервера:

const express = require('express');
const app = express();
const fs = require('fs');
const bodyParser = require('body-parser');
const cookieParser = require('cookie-parser');
const expressWs = require('express-ws')(app);
const session = require('express-session');
const cors = require('cors');

const sessVariables = JSON.parse(fs.readFileSync('session-variables.json').toString());

app.use(express.json());
app.use(express.urlencoded({extended: true}));
app.use(bodyParser.json());
app.use(cors());
app.use(bodyParser.urlencoded({extended: true}));
app.use(session({
    resave: true,
    saveUninitialized: true,
    secret: 'crack',
    cookie: { secure: false, maxAge: 3600000 }
}))

app.get('/init',(req, res)=>{
    req.session.sessId = 0; //storing the variable here
    console.log('websocket server is up');
    res.status(200).send();
})

app.ws('/request',(client, req)=>{
    console.log(client);
    client.on('message',(data)=>{
        console.log(req.session)
        console.log(data, req.session.id, req.session.sessId); //sessId blank undefined
    })
})

app.listen(3000,()=>{console.log('Server started at port 3000')});

Клиентский скрипт

window.onload = function(){  //calling the init route to store the session
    $.ajax({
        type: 'GET',
        url: 'http://localhost:3000/init',
        success: function(){
            console.log('session initialized');
        },
        error: function(){
            console.log('error');
        }
    })
}

function sendText(){ //calling the function on a button click
    console.log(document.getElementById('txtsendtext').value);
    postData();
}

var Channel = new WebSocket('ws://localhost:3000/request/');

Channel.onopen = function(event){
    console.log(event);
}

function postData(){
    Channel.send('data');
}

ОБНОВЛЕНИЕ: Идентификатор сеанса отличается при вызове init и вызове веб-сокета после этого, но после вызова веб-сокета идентификатор сеанса сохраняется, и на странице refre sh инициализация вызывается снова, и сохраняется файл sessionsId, и я также могу получить к нему доступ в вызове websocket. Я получаю переменные сеанса при перезагрузке страницы, и после этого он сохраняется.

Почему я получаю разные идентификаторы сеанса для / init и / request?

РЕШЕНО: Требуется установить для ajax call asyn c значение false, чтобы ждать, пока вызов ajax установит идентификатор сеанса.

...