sc-stateless-presence icon indicating copy to clipboard operation
sc-stateless-presence copied to clipboard

Cannot read property 'exchange' of undefined

Open jrvaja opened this issue 6 years ago • 2 comments

Hey @jondubois , I am facing this issue with new socketcluster setup with sc-stateless.

1535086887244 - Origin: Worker (PID 5448)
   [Error] TypeError: Cannot read property 'exchange' of undefined
    at new SCStatelessPresence (/Volumes/Data-E/code/project/socketcluster/node_modules/sc-stateless-presence/index.js:10:33)
    at Object.module.exports.attach (/Volumes/Data-E/code/project/socketcluster/node_modules/sc-stateless-presence/index.js:168:10)
    at Object.<anonymous> (/Volumes/Data-E/code/project/socketcluster/worker.js:72:21)
    at Module._compile (internal/modules/cjs/loader.js:689:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)
    at Module.load (internal/modules/cjs/loader.js:599:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:538:12)
    at Function.Module._load (internal/modules/cjs/loader.js:530:3)
    at Function.Module.runMain (internal/modules/cjs/loader.js:742:12)
    at startup (internal/bootstrap/node.js:266:19)
1535086887253 - Worker 0 exited - Exit code: 1

This is my worker.js file

Worker.js

var SCWorker = require('socketcluster/scworker');
var express = require('express');
var serveStatic = require('serve-static');
var path = require('path');
var morgan = require('morgan');
var healthChecker = require('sc-framework-health-check');
var scStatelessPresence = require('sc-stateless-presence');

class Worker extends SCWorker {
  run() {
    console.log('   >> Worker PID:', process.pid);
    var environment = this.options.environment;

    var app = express();

    var httpServer = this.httpServer;
    var scServer = this.scServer;

    if (environment === 'dev') {
      // Log every HTTP request. See https://github.com/expressjs/morgan for other
      // available formats.
      app.use(morgan('dev'));
    }
    app.use(serveStatic(path.resolve(__dirname, 'public')));

    // Add GET /health-check express route
    healthChecker.attach(this, app);

    httpServer.on('request', app);

    var count = 0;

    /*
      In here we handle our incoming realtime connections and listen for events.
    */
    scServer.on('connection', function (socket) {

      // Some sample logic to show how to handle client events,
      // replace this with your own logic
      socket.on('sampleClientEvent', function (data) {
        count++;
        console.log('Handled sampleClientEvent', data);
        scServer.exchange.publish('sample', count);
      });

      var interval = setInterval(function () {
        socket.emit('random', {
          number: Math.floor(Math.random() * 5)
        });
      }, 1000);

      socket.on('disconnect', function () {
        clearInterval(interval);
      });
    });
  }
}
var worker = new Worker();
scStatelessPresence.attach(worker);

Could you please guide me what I am missing?

Thanks,

jrvaja avatar Aug 24 '18 05:08 jrvaja

@jrvaja You need to put scStatelessPresence.attach(worker); inside the Worker's run method otherwise the worker is not ready yet (e.g. the scServer doesn't exist yet at this point).

Also, you may want to use scStatelessPresence.attach(this); instead (since this inside the run method is the reference to the worker instance).

Ideally, all your worker logic should be executed from inside the worker's run method.

jondubois avatar Aug 29 '18 08:08 jondubois

@jondubois Thanks, I will try this. 👍

jrvaja avatar Oct 11 '18 09:10 jrvaja