15

I try to create a class on my node.js / express app.

It works in basic js / prototype mode such as :

function MyClass() { 
    /* constructor code */
};

MyClass.prototype.myMethod = function() {
    /* method code */
};

module.exports = MyClass;

But I want to do use the class, constructor, extends, ... keywords.

I've try that :

class MyClass {
    constructor() {
        /* constructor code */
    }

    myMethod() {
        /* method code */
    }

}

But it doesn't work, the error is :

class MyClass {
^^^^^
SyntaxError: Unexpected reserved word

My command line to launch the app with all harmony options :

node `node --v8-options | grep harmony | cut -d ' ' -f | xargs` my-app.js 

An idea to launch my app correctly please ?

ceadreak
  • 1,662
  • 2
  • 18
  • 27
  • 5
    Google's V8 engine that Node is built on [hasn't yet released support](https://kangax.github.io/compat-table/es6/#class) for ES6 `class`es. In general, ES6 feature support shouldn't be assumed as the [standard is still in "draft."](http://wiki.ecmascript.org/doku.php?id=harmony:specification_drafts) (Side note: `node --harmony` will enable all available Harmony options.) – Jonathan Lonowski Nov 27 '14 at 19:26
  • Did you solve this, as I have the same error? – Simon H Jan 04 '15 at 18:59
  • Yes, all is in the previous comment. You can't use all ES6 features for the moment – ceadreak Jan 04 '15 at 20:19
  • How did you get the cut command to work without providing an argument to -f ? – Jeff Dec 02 '15 at 16:27

3 Answers3

7

You can do this with io.js

iojs --use_strict --harmony_classes my-app.js

Or on node.js with traceur

var traceur = require('traceur');
traceur.require.makeDefault(function(file) {
  return file.indexOf('node_modules') == -1;
});

require('./my-app').run();

Make sure to test the new features before using them, some are not supported. Edit: You can check the compatibility list from here

SerkanSerttop
  • 588
  • 2
  • 9
  • Worth noting the order of these switches are important - the file name must be specified after the switches otherwise you will just receive the same error. – Dan May 01 '15 at 08:26
  • This does not really answer the original question. – Petr Peller Feb 25 '16 at 15:58
7

You need a newer version of nodejs. The class keyword is supported in 4.4.x, but I'm personally seeing it work in v4.2.6. (Not entirely sure what version of v8 released it, which is what would tell the node version.)

ThatBlairGuy
  • 2,426
  • 1
  • 19
  • 33
  • I had two versions of node installed. Ran "where node" and realized I was using the wrong one – Hoppe Oct 27 '17 at 14:44
  • 1
    @Hoppe - You might want to look at nodist. It allows you to set one version of node as the global default, and a different one for use in the local directory. My team has found it to be very helpful for avoiding versioning hassles. https://github.com/marcelklehr/nodist – ThatBlairGuy Oct 29 '17 at 23:42
4

I had this problem.

It was caused because I downloaded nodejs' source code than built/ compiled it on my Ubuntu. ./configure then make and make install.

For some reason the ES6 reserved words like class and extends were throwing SyntaxError: Unexpected reserved word, even when using --harmony flag.

It was solved by me downloading the nodejs binaries for linux (https://nodejs.org/download/).

Now class and extends work even without --harmony flag.

I believe the issue came about from my building/ compiling process. For some reason the ES6 additions were not built or configured properly.

The binaries, to my understanding, are built completely and correctly for linux already and therefore the ES6 is added and configured correctly.

l__flex__l
  • 1,388
  • 1
  • 16
  • 22