The Green Foxx The Green Foxx - 4 months ago 208
Node.js Question

Javascript ES6 on Nodejs : TypeError: object is not a constructor

I have this sample class sync.js as a module somewhere on my project.

'use strict';

export default class Sync{

constructor(dbConnection){
this.dbConnection = dbConnection;
}

test(){
return "This is a test " + this.dbConnection;
}
}


Then somewhere on my controller I am using this class as :

'use strict';

import Sync from '../../path/to/module'; // <-- works fine

const sync = new Sync('CONNECTION!'); // <-- meh

console.log(sync.test());


I was expecting something like this to be logged on the console
This is a test CONNECTION!
. But instead I am getting this error.
TypeError: object is not a constructor


What did I do wrong?

By the way if I removed the line
const sync = new Sync('CONNECTION!');
and changed
console.log()
to
console.log(Sync.test());
the output
This is a test undefined
is printed which is kind of what I expected. But what's wrong with my instatiation?

WTF?

Edit

Guys I think I found the problem, based on @JLRishe and rem035 pointed out, it was returning the instance of the class not the class itself. In fact there is an
index.js
that imports the
'./sync'
js file and exporting is as
export default new Sync();
. Here's the whole
index.js
.

'use strict';

import Sync from './sync';

export default new Sync(); // <-- potential prodigal code


The module tree looks like this.

module
|
|_ lib
| |_ index.js // this is the index.js I am talking about
| |_ sync.js
|
|_ index.js // the entry point, contains just `module.exports = require('./lib');`


Now. How do I export
export default new Sync();
without doing
new
?

Answer

EDIT 2

How do I export export default new Sync(); without doing new?

Just remove the new keyword from module/lib/index.js:

import Sync from './sync';

export default Sync;

Or directly import from module/lib/sync.js


EDIT 1

Based on the what you are saying is logged,

Sync { dbConnection: undefined }

it seems like your import is returning an instance of the class (which is an object), rather than the class definition itself.

So console.log(new Sync()) would return what you are saying,

class Sync {

  constructor(dbConnection) {
    this.dbConnection = dbConnection;
  }

  test() {
    return "This is a test " + this.dbConnection;
  }
}

console.log(new Sync());

not console.log(Sync)

class Sync {

  constructor(dbConnection) {
    this.dbConnection = dbConnection;
  }

  test() {
    return "This is a test " + this.dbConnection;
  }
}

console.log(Sync);

Are you sure you aren't calling new Sync anywhere prior to exporting?


Initial answer

The code in question works fine:

'use strict';

class Sync {

  constructor(dbConnection) {
    this.dbConnection = dbConnection;
  }

  test() {
    return "This is a test " + this.dbConnection;
  }
}

const sync = new Sync('CONNECTION!');

console.log(sync.test());

Based on your error:

TypeError: object is not a constructor

Your import is not returning what you think it's returning and you are trying to new something that cannot be instantiated.

Most likely your import path is wrong.