express-ws icon indicating copy to clipboard operation
express-ws copied to clipboard

loss messages before setting a listener

Open karikera opened this issue 5 years ago • 0 comments

It seems MySQL store wait for a little to get a session. It makes loss messages

Reproduction:

  1. use a session with MySQL store,
  2. store something to the session
  3. restart the server
  4. send a message from the client immediately on it opened

Result:

  • Loss messages

source:

var express = require("express");
var expressWs = require("express-ws");
var session = require("express-session");
var ExpressMySQLSession = require("express-mysql-session");
var MySQLStore = ExpressMySQLSession(session);
var sessionStore = new MySQLStore({
    host: 'localhost',
    user: 'root',
    database: 'express_session',
    password: 'password'
});
var app = expressWs(express()).app;
app.use(session({
    secret: 'secret',
    saveUninitialized: false,
    resave: false,
    store: sessionStore
}));
app.get('/', function (req, res) {
    // store something to the session
    console.log(req.session.something);
    req.session.something = 'something';
    // this client will reconnect automatically
    res.send("\n<script>\nfunction connect()\n{\n    const ws = new WebSocket('ws://localhost:8000/api/ws');\n    ws.onclose = ev=>{\n        setTimeout(connect, 1000);\n    };\n    ws.onopen = ()=>{\n        ws.send('data');\n    };\n    ws.onmessage = ev=>{\n        console.log(ev.data);\n    };\n}\nconnect();\n</script>\n");
});
app.ws('/api/ws', function (ws, req) {
    console.log('data will received');
    ws.on('message', function (data) {
        console.log('data receivd:' + data);
    });
});
app.listen(8000);

karikera avatar Mar 14 '20 09:03 karikera