Session: TypeError: Cannot read property 'session' of undefined

Created on 14 Aug 2018  路  2Comments  路  Source: expressjs/session

I have been trying to use source code from the Kurento project for video streaming which implements express-sessions however I'm getting the error specified in the title.

I have posted in the kurento forum, their git repo and on stack overflow but no one has given me an answer yet as according to them the source code works as is.

Any help would be greatly appreciated.

Server.js :

var express = require('express');
var session = require('express-session')
var ws = require('ws');
var KurentoClient = require('./Kurento/KurentoClient');
var fs = require('fs');

const KURENTO_WS_URL = 'ws://130.161.177.154:8888/kurento';

//
// Express
//
var app = express();

var sessionHandler = session({
    secret : 'none',
    rolling : true,
    resave : true,
    saveUninitialized : true
});

app.use(sessionHandler);

//
// Static
//
app.use(express.static('client'));

app.listen(3000, function(){
    console.log('listenning at 3000');
});

//
// Web Socket
// 
var wss = new ws.Server({
     port: 8080,     
});  

wss.on('connection', function connect(newSocket, req){
    //let sessionId = newSocket.upgradeReq.session.id;
    let sessionId;
    let request = newSocket.upgradeReq;
    let response = {
        writeHead : {}
    };

    sessionHandler(request, response, function(err) {
        sessionId = request.session.id;
        console.log('Connection received with sessionId ' + sessionId);
    });

    // create a new KurentoClient for each client
    let kClient = new KurentoClient(KURENTO_WS_URL, newSocket);

    newSocket.on('open', function(){
        console.log(`connected to ${req.connection.remoteAddress}`);        
    });

    newSocket.on('close', function(){
        console.log('disconnected');
        kClient.destroyPipeline(sessionId);
    });

    newSocket.on('error', function(err){
        console.log(err);
        kClient.destroyPipeline(sessionId);
    });

    //
    // Message
    //
    newSocket.on('message', function onMessage(msg){
        var parsedMsg = JSON.parse(msg);        

        switch(parsedMsg.id){
            case 'start':
                console.log('received "start" message ');

                kClient.createPipeline(sessionId, parsedMsg.sdpOffer, function(err, sdpAnswer){
                    let response;
                    if(err){
                        console.error(err);

                        response = JSON.stringify({
                            id: 'error',
                            message: err
                        });
                    }
                    else{
                        if(parsedMsg.sdpOffer != null){
                            response = JSON.stringify({
                                id: 'sdpAnswer',
                                sdpAnswer: sdpAnswer
                            });
                        }
                        else {       
                            console.log('f');
                            response = JSON.stringify({});
                        }
                    }

                    return newSocket.send(response);
                });
                break;

            case 'stop':
                kClient.destroyPipeline(sessionId);
            break;

            case 'iceCandidate':
                console.log('received ice candidate');

                kClient.addClientIceCandidate(sessionId, parsedMsg.candidate);
                break;

            default:
                newSocket.send(JSON.stringify({
                    id: 'error',
                    message: 'Invalid message '
                }));
                break;
        }
    });          
});

Error:

C:\Users\adamom\rtpend\node_modules\express-session\index.js:180
if (req.session) {
^

TypeError: Cannot read property 'session' of undefined
at session (C:\Users\adamom\rtpend\node_modules\express-session\index.js:180:13)
at WebSocketServer.connect (C:\Users\adamom\rtpend\server.js:47:5)
at emitTwo (events.js:126:13)
at WebSocketServer.emit (events.js:214:7)
at handleUpgrade (C:\Users\adamom\rtpend\node_modules\ws\lib\websocket-server.js:82:18)
at WebSocketServer.completeUpgrade (C:\Users\adamom\rtpend\node_modules\ws\lib\websocket-server.js:294:5)
at WebSocketServer.handleUpgrade (C:\Users\adamom\rtpend\node_modules\ws\lib\websocket-server.js:233:10)
at Server.upgrade (C:\Users\adamom\rtpend\node_modules\ws\lib\websocket-server.js:81:16)
at emitThree (events.js:136:13)
at Server.emit (events.js:217:7)

Most helpful comment

Thank you for such a quick reply!

Helped me instantly, the problem was that the source was using an old version of ws which since the writing of the code has removed ws.upgradeReq

The fix was as simple as defining what the req was...

wss.on('connection', function connect(newSocket, req){
    //let sessionId = newSocket.upgradeReq.session.id;
    newSocket.upgradeReq = req;
    let sessionId;
    let request = newSocket.upgradeReq;
    ...

All 2 comments

Based on the stack trace newSocket.upgradeReq is undefined, so you're not passing in a request object as the first argument to our middleware.

Thank you for such a quick reply!

Helped me instantly, the problem was that the source was using an old version of ws which since the writing of the code has removed ws.upgradeReq

The fix was as simple as defining what the req was...

wss.on('connection', function connect(newSocket, req){
    //let sessionId = newSocket.upgradeReq.session.id;
    newSocket.upgradeReq = req;
    let sessionId;
    let request = newSocket.upgradeReq;
    ...
Was this page helpful?
0 / 5 - 0 ratings