serialize icon indicating copy to clipboard operation
serialize copied to clipboard

obj.hasOwnProperty(key) fails in serialize.js at line #25

Open dibyendu opened this issue 8 years ago • 5 comments

This is a simple socket.io application.

const serialize = require('node-serialize'),
      io = require('socket.io')(3333);

var active_socket_list = { };
io.on('connection', function (socket) {
  active_socket_list[socket.id] = socket;

  console.log('========== Active Sockets ==========');
  console.log(active_socket_list);
  console.log('============== END =============');
  var key;
  for (key in active_socket_list) {
    console.log(' Key --> ' + key + ' ==> ' + active_socket_list.hasOwnProperty(key));
  }
  console.log('========== Serializing ==========');
  var active_socket_list_string = serialize.serialize(active_socket_list);
  console.log('========> ' + typeof active_socket_list_string);
  var new_list = serialize.unserialize(active_socket_list_string);
  console.log('========> ' + typeof new_list);
  var new_socket = new_list[socket.id];
  new_socket.emit('response', 'Hello world');
  
  socket.on('disconnect', function () {
    delete active_socket_list[socket.id];
  });
});

I want to serialize (and later de-serialize) the active_socket_list object, which contains few socket.io socket objects indexed by their socket.id's.

But when I run the code (and there are 2 active sockets open) it fails with an error log as follows:

========== Active Sockets ==========
{ vwGdhtZ2OCYU725_AAAA: 
   Socket {
     nsp: 
      Namespace {
        name: '/',
        server: [Object],
        sockets: [Object],
        connected: [Object],
        fns: [Object],
        ids: 0,
        rooms: [],
        flags: {},
        adapter: [Object],
        _events: [Object],
        _eventsCount: 1 },
     server: 
      Server {
        nsps: [Object],
        _path: '/socket.io',
        _serveClient: true,
        parser: [Object],
        encoder: Encoder {},
        _adapter: [Function: Adapter],
        _origins: '*:*',
        sockets: [Object],
        eio: [Object],
        httpServer: [Object],
        engine: [Object] },
     adapter: 
      Adapter {
        nsp: [Object],
        rooms: [Object],
        sids: [Object],
        encoder: Encoder {} },
     id: 'vwGdhtZ2OCYU725_AAAA',
     client: 
      Client {
        server: [Object],
        conn: [Object],
        encoder: Encoder {},
        decoder: [Object],
        id: 'vwGdhtZ2OCYU725_AAAA',
        request: [Object],
        onclose: [Function: bound ],
        ondata: [Function: bound ],
        onerror: [Function: bound ],
        ondecoded: [Function: bound ],
        sockets: [Object],
        nsps: [Object],
        connectBuffer: [] },
     conn: 
      Socket {
        id: 'vwGdhtZ2OCYU725_AAAA',
        server: [Object],
        upgrading: false,
        upgraded: true,
        readyState: 'open',
        writeBuffer: [],
        packetsFn: [],
        sentCallbackFn: [],
        cleanupFn: [Object],
        request: [Object],
        remoteAddress: '::ffff:192.168.2.139',
        checkIntervalTimer: null,
        upgradeTimeoutTimer: null,
        pingTimeoutTimer: [Object],
        transport: [Object],
        _events: [Object],
        _eventsCount: 3 },
     rooms: { vwGdhtZ2OCYU725_AAAA: 'vwGdhtZ2OCYU725_AAAA' },
     acks: {},
     connected: true,
     disconnected: false,
     handshake: 
      { headers: [Object],
        time: 'Fri May 12 2017 01:00:44 GMT+0530 (IST)',
        address: '::ffff:192.168.2.139',
        xdomain: true,
        secure: false,
        issued: 1494531044410,
        url: '/socket.io/?auth_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsYXN0IjoiRGFzIiwiaWQiOjEyMywiZmlyc3QiOiJEaWJ5ZW5kdSJ9.5Da6dnJzVzQtJOKGqWlGeAlsUt1_9-6OTWoFp_ynhRY&EIO=3&transport=polling&t=LltplON',
        query: [Object] },
     fns: [],
     flags: {},
     _rooms: [],
     _events: { disconnect: [Function] },
     _eventsCount: 1 },
  'DABYtF-AtqbxtuB5AAAB': 
   Socket {
     nsp: 
      Namespace {
        name: '/',
        server: [Object],
        sockets: [Object],
        connected: [Object],
        fns: [Object],
        ids: 0,
        rooms: [],
        flags: {},
        adapter: [Object],
        _events: [Object],
        _eventsCount: 1 },
     server: 
      Server {
        nsps: [Object],
        _path: '/socket.io',
        _serveClient: true,
        parser: [Object],
        encoder: Encoder {},
        _adapter: [Function: Adapter],
        _origins: '*:*',
        sockets: [Object],
        eio: [Object],
        httpServer: [Object],
        engine: [Object] },
     adapter: 
      Adapter {
        nsp: [Object],
        rooms: [Object],
        sids: [Object],
        encoder: Encoder {} },
     id: 'DABYtF-AtqbxtuB5AAAB',
     client: 
      Client {
        server: [Object],
        conn: [Object],
        encoder: Encoder {},
        decoder: [Object],
        id: 'DABYtF-AtqbxtuB5AAAB',
        request: [Object],
        onclose: [Function: bound ],
        ondata: [Function: bound ],
        onerror: [Function: bound ],
        ondecoded: [Function: bound ],
        sockets: [Object],
        nsps: [Object],
        connectBuffer: [] },
     conn: 
      Socket {
        id: 'DABYtF-AtqbxtuB5AAAB',
        server: [Object],
        upgrading: false,
        upgraded: false,
        readyState: 'open',
        writeBuffer: [],
        packetsFn: [],
        sentCallbackFn: [],
        cleanupFn: [Object],
        request: [Object],
        remoteAddress: '::ffff:192.168.2.139',
        checkIntervalTimer: null,
        upgradeTimeoutTimer: null,
        pingTimeoutTimer: [Object],
        transport: [Object],
        _events: [Object],
        _eventsCount: 3 },
     rooms: { 'DABYtF-AtqbxtuB5AAAB': 'DABYtF-AtqbxtuB5AAAB' },
     acks: {},
     connected: true,
     disconnected: false,
     handshake: 
      { headers: [Object],
        time: 'Fri May 12 2017 01:00:46 GMT+0530 (IST)',
        address: '::ffff:192.168.2.139',
        xdomain: true,
        secure: false,
        issued: 1494531046069,
        url: '/socket.io/?auth_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsYXN0IjoiRGFzIiwiaWQiOjEyMywiZmlyc3QiOiJEaWJ5ZW5kdSJ9.5Da6dnJzVzQtJOKGqWlGeAlsUt1_9-6OTWoFp_ynhRY&EIO=3&transport=polling&t=Lltploh',
        query: [Object] },
     fns: [],
     flags: {},
     _rooms: [],
     _events: { disconnect: [Function] },
     _eventsCount: 1 } }
============== END =============
 Key --> vwGdhtZ2OCYU725_AAAA ==> true
 Key --> DABYtF-AtqbxtuB5AAAB ==> true
========== Serializing ==========
/home/abc/Desktop/node_modules/node-serialize/lib/serialize.js:25
    if(obj.hasOwnProperty(key)) {
           ^

TypeError: obj.hasOwnProperty is not a function
    at Object.exports.serialize (/home/abc/Desktop/node_modules/node-serialize/lib/serialize.js:25:12)
    at Object.exports.serialize (/home/abc/Desktop/node_modules/node-serialize/lib/serialize.js:38:36)
    at Object.exports.serialize (/home/abc/Desktop/node_modules/node-serialize/lib/serialize.js:38:36)
    at Object.exports.serialize (/home/abc/Desktop/node_modules/node-serialize/lib/serialize.js:38:36)
    at Object.exports.serialize (/home/abc/Desktop/node_modules/node-serialize/lib/serialize.js:38:36)
    at Object.exports.serialize (/home/abc/Desktop/node_modules/node-serialize/lib/serialize.js:38:36)
    at Object.exports.serialize (/home/abc/Desktop/node_modules/node-serialize/lib/serialize.js:38:36)
    at Object.exports.serialize (/home/abc/Desktop/node_modules/node-serialize/lib/serialize.js:38:36)
    at Object.exports.serialize (/home/abc/Desktop/node_modules/node-serialize/lib/serialize.js:38:36)
    at Object.exports.serialize (/home/abc/Desktop/node_modules/node-serialize/lib/serialize.js:38:36)

I'm using NodeJs version v7.9.0 and [email protected]

dibyendu avatar May 11 '17 14:05 dibyendu

I'm a Javascript newbie so forgive the horrible code...

I ran my object through a function to convert it to an Object...and that error went away... (the "seen" is to handle circualr references)

function traverse(thing, _seen) { let seen = _seen || [] if (typeof(thing) === "object" && thing !== null && seen.indexOf(thing) === -1) { seen.push(thing) if (typeof(thing.hasOwnProperty) === 'undefined') { Object.setPrototypeOf(thing, Object) } for (var _thing in thing) { traverse(thing[_thing], seen) } } return thing }

langal avatar Sep 09 '17 06:09 langal

Same issue Unhandled Rejection: TypeError: obj.hasOwnProperty is not a function

mayeaux avatar Dec 24 '17 22:12 mayeaux

@dibyendu did you ever get something working?

mayeaux avatar Dec 24 '17 22:12 mayeaux

I'm having same Issue While Sending binary data over a socket Connection.

E:\ProjectName\node_modules\socket.io-parser\dist\binary.js:39
            if (data.hasOwnProperty(key)) {
                     ^
TypeError: data.hasOwnProperty is not a function
at _deconstructPacket (E:\ProjectName\node_modules\socket.io-parser\dist\binary.js:39:22)

Professor833 avatar Feb 05 '21 18:02 Professor833

i had the same error, and changed line 25 of lib/serialize.js from: if(obj.hasOwnProperty(key)) { to: if((obj instanceof Object) ?obj.hasOwnProperty(key):{}) {

and it seems to have allowed my objects to serialize now.

davidbuzz avatar Feb 01 '22 08:02 davidbuzz