SyntaxError: utilisation de const en mode strict


241

Je travaille avec Node.js, et dans l' un de mes fichiers js J'utilise constdans "strict mode". En essayant de l'exécuter, j'obtiens une erreur:

SyntaxError: Use of const in strict mode.

Quelle est la meilleure pratique pour ce faire?

Éditer:

'use strict'
const MAX_IMAGE_SIZE = 1024*1024; // 1 MB

@thefourtheye vérifier en chrome, ff fonctionne bien.
Zaheer Ahmed

utiliser var. Ajouter semikolon'use strict';
Adrian Preuss

@ZaheerAhmed En fait, j'utilise Node.js yaar. Cela fonctionne très bien.
thefourtheye

Aah ... échoue dans ideone.com
thefourtheye

Après avoir mis à jour la dernière version de Node v5.3.0, cela fonctionne bien maintenant.
zangw

Réponses:


284

Le constet letfont partie d'ECMAScript 2015 (aka ES6 et Harmony), et n'étaient pas activés par défaut dans Node.js 0.10 ou 0.12. Depuis Node.js 4.x, "Toutes les fonctionnalités de livraison [ES2015], que V8 considère comme stables, sont activées par défaut sur Node.js et ne nécessitent aucun type d'indicateur d'exécution.". Les documents Node.js ont une vue d'ensemble des fonctionnalités ES2015 activées par défaut et de celles qui nécessitent un indicateur d'exécution . Ainsi, en mettant à niveau vers Node.js 4.x ou une version plus récente, l'erreur devrait disparaître.

Pour activer certaines des fonctionnalités d'ECMAScript 2015 (y compris constet let) dans Node.js 0.10 et 0.12; démarrez votre programme de noeud avec un drapeau d'harmonie, sinon vous obtiendrez une erreur de syntaxe. Par exemple:

node --harmony app.js

Tout dépend de quel côté se trouve votre js strict. Je recommanderais d'utiliser le mode strict avec des constdéclarations côté serveur et de démarrer le serveur avec le drapeau d'harmonie. Pour le côté client, vous devez utiliser Babel ou un outil similaire pour convertir ES2015 en ES5, car tous les navigateurs clients ne prennent pas en charge les constdéclarations.


8
C'est la réponse la plus complète et la plus pertinente.
zamnuts

Le mode strict peut également être appliqué en utilisant un nœud indicateur (plutôt qu'une expression littérale) --harmony --use_strict app.js Ce qui est bien.
Adria

7
Je voudrais déconseiller d'utiliser le drapeau "use_strict". Il exécute le code de quelqu'un d'autre dans un interpréteur pour lequel il n'a pas été écrit. Utilisez toujours 'use strict';vous-même, mais laissez le code tiers décider par lui-même.
Thomas Jensen

1
FWIW J'ai trouvé le même problème lors de l'exécution du nœud v8.1 mais de la version armfh (raspberry pi).
James

238

Si cela se produit dans nodejs, cela est dû à l'ancienne version de nodejs. Mettre à jour le nœud en utilisant,

1) Vider le cache de NPM:

sudo npm cache clean -f

2) Installez un petit assistant appelé 'n'

sudo npm install -g n

3) Installez la dernière version stable de NodeJS

sudo n stable

Mettre à jour les instructions de nodejs tirées de, https://stackoverflow.com/a/19584407/698072


3
J'ai reçu ce "npm ERR! Notsup Non pris en charge npm ERR! Notsup Non compatible avec votre système d'exploitation ou votre architecture: n@2.1.4" en essayant de faire l'étape 2. Bon moment.
VSO

1
Selon votre cas d'utilisation, il peut être plus sûr de spécifier la nodeversion. Par exemple, au moment d'écrire ces lignes, sudo n 6.9.4installera le dernier LTS, où sudo n stablesera installé 7.4.0. De toute évidence, c'est un changement de rupture, alors faites attention avec n stable. Vous pouvez également sudo n ltsinstaller le LTS le plus récent.
jfmercer

1
Fonctionne sur centos 6.5. Plus tôt, j'obtenais l'erreur suivante "SyntaxError: Utilisation de const en mode strict". Merci
Himanshu Chauhan

1
Cela a résolu le problème pour moi sur une machine héritée où le drapeau --harmony ne l'était pas. Configuration: Essayer de lancer un moniteur de démarrage d'écran npm à l'aide de scripts dans crontab a provoqué l'erreur stricte là où il ne l'a pas été à partir de la cli. La version précédente du nœud était 0.10.48 fonctionnant sur ubuntu 12.04.5 LTS J'ai suivi cette étape et celle en changeant le lien logiciel / usr / bin / node de / etc / alternatives / node en /usr/local/n/versions/node/8.0 .0 / bin / node et tout a fonctionné. Merci pour ça!
Brian Layman

1
Merci pour cela, il a non seulement résolu ce problème, mais aussi toutes les petites faiblesses inhérentes lors de la construction de SCA Local
jk121960

22

Habituellement, cette erreur se produit lorsque la version du nœud sur lequel le code est exécuté est plus ancienne que prévu. (c'est-à-dire 0,12 ou plus).

si vous utilisez nvm, veuillez vous assurer que vous disposez de la bonne version du nœud utilisé. Vous pouvez vérifier la compatibilité sur node.green pour const en mode strict

J'ai trouvé un problème similaire sur un autre post et y ai posté ma réponse en détail


1
J'ai rencontré cela lors de l'exécution de mon projet Node dans WebStorm. Ma version locale dans le référentiel exécutait le nœud 8.2.1, mais WebStorm a regardé mon /usr/bin/nodedossier, qui contenait 0.10.46.
Shadoninja

20

Une étape importante après la mise à jour de votre nœud consiste à lier votre binaire de nœud à la dernière version de nœud installée

sudo ln -sf /usr/local/n/versions/node/6.0.0/bin/node /usr/bin/node  

1
Comment savoir quelle version vient d'être installée?
Jose Llausas

1
Vous pouvez trouver où votre version actuelle du nœud est installée en exécutantwhich node
Steve

Vous aurez également vu le répertoire lors de l'exécution de "n stable" Dans cette ligne: mkdir: /usr/local/n/versions/node/8.0.0 Vous pouvez donc simplement aller dans / usr / local / n / versions / node / et voyez quels répertoires existent.
Brian Layman

@JoseLlausas node --versionimprime le numéro de version par exemplev0.10.29
Markus

15

Ce n'est probablement pas la solution pour tout le monde, mais c'était pour moi.

Si vous utilisez NVM, vous n'avez peut-être pas activé la bonne version de nœud pour le code que vous exécutez. Après le redémarrage, votre version par défaut du nœud redevient la valeur par défaut du système.

J'étais confronté à cela lorsque je travaillais avec React-Native qui fonctionnait bien. Utilisez simplement nvm pour utiliser la bonne version de node pour résoudre ce problème.


2
et n'importe quel code pour illustrer votre "solution" indiquée ci-dessus?
Kermit_ice_tea

oui, c'était mon problème initial. même si j'ai dû passer à un autre serveur linux de toute façon en raison de problèmes de compatibilité de version de nœud et gcc sur une version centos obsolète.
Robot70

@Kermit_ice_tea Le même code dans la question. Le bogue se trouve dans la version de node, en utilisant NVM pour le définir sur une version qui n'a pas ce bogue fait passer ce code. nvm use version-number-you-needest tout ce que vous avez à faire.
Boatcoder

8

Depuis le moment où la question a été posée, le projet de constmot-clé est déjà un niveau de vie dans le cadre d' ECMAScript 2015 . La version actuelle de Node.js prend également en charge les déclarations const sans l' --harmonyindicateur.

Cela dit, vous pouvez maintenant exécuter node app.js avec app.js:

'use strict';
const MB = 1024 * 1024;
...

obtenir à la fois le sucre de syntaxe et les avantages du mode strict.


Un mégaoctet MBest une puissance de dix, tandis qu'un mégaoctet MiBest une puissance de deux. c'est à dire 1MB = 1e6et 1MiB = 1024 * 1024. Voir wikipedia: Mebibyte
DJDaveMark

0

J'ai eu un problème similaire récemment et je me suis retrouvé dans ce Q&R. Ce n'est pas la solution que le PO recherchait mais peut aider les autres avec un problème similaire.

J'utilise PM2 pour exécuter un projet et dans un serveur de transfert donné, j'avais une version très ancienne de Node, NPM et PM2. J'ai tout mis à jour, cependant, j'ai gardé la même erreur:

SyntaxError: utilisation de const en mode strict.

J'ai essayé d'arrêter et de démarrer l'application plusieurs fois. J'ai également essayé de tout mettre à jour à nouveau. Rien n'a fonctionné. Jusqu'à ce que je remarque un avertissement lorsque je cours pm2 start:

>>>> PM2 en mémoire obsolète, faites:
>>>> Mise à jour $ pm2
En version PM2 en mémoire: 0.15.10
Version PM2 locale: 3.2.9

Je t'ai eu! Après avoir exécuté pm2 update, j'ai finalement pu faire fonctionner l'application comme prévu. Plus d'erreurs "const en mode strict".


-2

const n'est pas pris en charge par ECMAScript. Ainsi, après avoir spécifié le mode strict, vous obtenez une erreur de syntaxe. Vous devez utiliser var au lieu de const si vous voulez que votre code soit compatible avec tous les navigateurs. Je sais, pas la solution idéale, mais c'est ce que c'est. Il existe des moyens de créer des propriétés en lecture seule en JavaScript (voir Les propriétés en lecture seule peuvent-elles être implémentées en JavaScript pur? ), Mais je pense que cela peut être exagéré selon votre scénario.

Ci-dessous, la note de compatibilité du navigateur de MDN :

Compatibilité du navigateur

L'implémentation actuelle de const est une extension spécifique à Mozilla et ne fait pas partie d'ECMAScript 5. Elle est prise en charge dans Firefox et Chrome (V8). Depuis Safari 5.1.7 et Opera 12.00, si vous définissez une variable avec const dans ces navigateurs, vous pouvez toujours changer sa valeur plus tard. Elle n'est pas prise en charge dans Internet Explorer 6-10, mais est incluse dans Internet Explorer 11. Le mot clé const déclare actuellement la constante dans l'étendue de la fonction (comme les variables déclarées avec var).

Firefox, au moins depuis la version 13, lance une TypeError si vous redéclarez une constante. Aucun des principaux navigateurs ne produit d'avis ou d'erreur si vous attribuez une autre valeur à une constante. La valeur de retour d'une telle opération est celle de la nouvelle valeur affectée, mais la réattribution échoue uniquement dans Firefox et Chrome (au moins depuis la version 20).

const va être défini par ECMAScript 6, mais avec une sémantique différente. Comme pour les variables déclarées avec l'instruction let, les constantes déclarées avec const auront une portée de bloc.


3
constest pris en charge dans ECMAScript 6 et il est largement pris en charge: kangax.github.io/compat-table/es6/#const Mais vous avez raison dans votre réponse - 'use strict';et constne mélange pas.
dotnetCarpenter

Un test rapide montre que constc'est re-déclarable dans Safari 7 mais pas dans Opera 21, Chrome 35 et Firefox 29.
dotnetCarpenter

21
La compatibilité de navigation n'est pas un problème ... c'est Node.js
zamnuts

-2

L'utilisation consten mode strict est disponible avec la sortie de Chrome 41. Actuellement, Chrome 41 Beta est déjà sorti et le supporte.


6
Juste pour clarifier, je voulais dire que depuis que l'OP a demandé Node.js, la compatibilité du navigateur n'est pas pertinente. Pourtant, en quelque sorte, la réponse avait 4 votes positifs, et elle a obscurci d'autres réponses plus pertinentes.
Dan Dascalescu

-3
cd /
npm install -g nave
nave use 6.11.1
node app.js

Pour le serveur Linux
Ayhmi

1
Bienvenue dans Stack Overflow. Lorsque vous apportez une réponse, il est préférable de donner à la fois du code et une explication.
O. Jones

2
Vote contre parce qu'il n'y a aucune explication. pourquoi le paquet nave devrait être installé ..
Sean83

Pourquoi une telle solution fonctionnerait-elle? Une explication est nécessaire.
Paul Isaris

Bien qu'il n'y ait aucune explication, pour moi l'erreur n'a été résolue qu'après avoir exécuté les commandes décrites ici: npm install -g nave; nave use 6.11.1 +1
Ruben Alves
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.