Я пишу сценарий на стороне сервера, который имеет маршруты веб-сокетов с использованием 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 установит идентификатор сеанса.