Search code examples
feathersjs

connection in channels.js returns undefined?


I'm trying to establish a real-time socket connection to my client side via feathers channels. It works without any sort of authentication. But if i add the following login action scoket is throwing a weak map key error.

app.on('login', (authResult, { connection }) => {
 console.log(connection) // returns undefined
 ....
})

This is the error I'm receiving

Unhandled Rejection at: Promise Promise { TypeError: Invalid value used as weak map key at WeakMap.set ()

  app.on('login', (authResult, { connection }) => {
    console.log("============>>", connection)
    if (authResult && connection) {
      app.channel('anonymous').leave(connection);
      if (authResult.user && authResult.user['chanelName']) {
        let channelName = authResult.user['chanelName'].toString();
        channelName = channelName.substr(0, 5)
        app.channel(`channel/${channelName}`).join(connection);
      } else
        app.channel('authenticated').join(connection)
    }
  });

The connection object is undefined, i think that causes the problem. Anu suggestions?


Solution

  • Please provide the client side script. According to fethers documentation connection can be undefined if there is no real-time connection, e.g. when logging in via REST.

    You should authenticate your client.

    Sample script

    const feathers = require('@feathersjs/feathers');
    const socketio = require('@feathersjs/socketio-client');
    const io = require('socket.io-client');
    const auth = require('@feathersjs/authentication-client');
    const socket = io('http://localhost:3031');
    const app = feathers();
    // Setup the transport (Rest, Socket, etc.) here
    app.configure(socketio(socket));
    const options = {
      header: 'Authorization', // the default authorization header for REST
      prefix: '', // if set will add a prefix to the header value. for example if prefix was 'JWT' then the header would be 'Authorization: JWT eyJ0eXAiOiJKV1QiLCJhbGciOi...'
      path: '/authentication', // the server-side authentication service path
      jwtStrategy: 'jwt', // the name of the JWT authentication strategy 
      entity: 'user', // the entity you are authenticating (ie. a users)
      service: 'users', // the service to look up the entity
      cookie: 'feathers-jwt', // the name of the cookie to parse the JWT from when cookies are enabled server side
      storageKey: 'feathers-jwt', // the key to store the accessToken in localstorage or AsyncStorage on React Native
      storage: undefined // Passing a WebStorage-compatible object to enable automatic storage on the client.
    }
    app.configure(auth(options))
    app.authenticate({
      strategy: 'jwt',
      accessToken: '<JWT TOKEN>'
    }).then(() => {
      console.log("Auth successfull")
      const deviceService = app.service('myService');
      deviceService.on('created', message => console.log('Created a message', message));
    }).catch(e => {
      console.error('Authentication error', e);
      // Show login page
    });
    

    Hope this will help you.