SyntaxError: Verwendung von const im strengen Modus


241

Ich arbeite mit node.js und in einer meiner js-Dateien, die ich constin verwende "strict mode". Beim Versuch, es auszuführen, wird folgende Fehlermeldung angezeigt:

SyntaxError: Use of const in strict mode.

Was ist die beste Vorgehensweise, um dies zu tun?

Bearbeiten:

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

@ thefourtheye check in chrome, ff funktioniert einwandfrei.
Zaheer Ahmed

verwenden var. Semikolon hinzufügen'use strict';
Adrian Preuss

@ZaheerAhmed Eigentlich benutze ich Node.js yaar. Das funktioniert gut.
thefourtheye


Nach dem Update der neuesten Node-Version v5.3.0 funktioniert es jetzt einwandfrei.
Zangw

Antworten:


284

Die constund letsind Teil von ECMAScript 2015 (auch bekannt als ES6 und Harmony) und wurden in Node.js 0.10 oder 0.12 standardmäßig nicht aktiviert. Seit Node.js 4.x sind alle Versandfunktionen [ES2015], die V8 als stabil erachtet, in Node.js standardmäßig aktiviert und erfordern KEIN Laufzeitflag. “ Node.js docs bietet einen Überblick darüber, welche ES2015-Funktionen standardmäßig aktiviert sind und für welche ein Laufzeitflag erforderlich ist . Durch ein Upgrade auf Node.js 4.x oder neuer sollte der Fehler verschwinden.

Um einige der ECMAScript 2015-Funktionen (einschließlich constund let) in Node.js 0.10 und 0.12 zu aktivieren ; Starten Sie Ihr Knotenprogramm mit einem Harmony-Flag. Andernfalls wird ein Syntaxfehler angezeigt. Beispielsweise:

node --harmony app.js

Es hängt alles davon ab, auf welcher Seite sich Ihr striktes js befindet. Ich würde empfehlen, den strengen Modus mit constDeklarationen auf Ihrer Serverseite zu verwenden und den Server mit dem Harmony-Flag zu starten. Für die Client-Seite sollten Sie Babel oder ein ähnliches Tool verwenden, um ES2015 in ES5 zu konvertieren, da nicht alle Client-Browser die constDeklarationen unterstützen.


8
Dies ist die vollständigste und relevanteste Antwort.
Zamnuts

Der strikte Modus kann auch mithilfe eines Flag-Knotens (anstelle eines wörtlichen Ausdrucks) angewendet werden. --Harmony --use_strict app.js Das ist schön.
Adria

7
Ich möchte davon abraten, das Flag "use_strict" zu verwenden. Es wird der Code eines anderen in einem Interpreter ausgeführt, für den er nicht geschrieben wurde. Verwenden 'use strict';Sie sich immer selbst, aber lassen Sie den Code von Drittanbietern selbst entscheiden.
Thomas Jensen

1
FWIW Ich habe das gleiche Problem beim Ausführen von Node v8.1 gefunden, jedoch bei der Armfh-Version (Himbeer-Pi).
James

238

Wenn dies in nodejs geschieht, liegt dies an der älteren Version von nodejs. Aktualisieren Sie den Knoten mit,

1) Löschen Sie den NPM-Cache:

sudo npm cache clean -f

2) Installieren Sie einen kleinen Helfer namens 'n'

sudo npm install -g n

3) Installieren Sie die neueste stabile NodeJS-Version

sudo n stable

Aktualisieren Sie die Anweisungen von nodejs unter https://stackoverflow.com/a/19584407/698072


3
Ich habe dieses "npm ERR! Notsup Nicht unterstützt npm ERR! Notsup Nicht kompatibel mit Ihrem Betriebssystem oder Ihrer Architektur: n@2.1.4" erhalten, als ich versucht habe, Schritt 2 auszuführen. Gute Zeiten.
VSO

1
Abhängig von Ihrem Anwendungsfall ist es möglicherweise sicherer, die nodeVersion anzugeben . Zum Beispiel wird zum Zeitpunkt dieses Schreibens sudo n 6.9.4das neueste LTS sudo n stableinstalliert , wo es installiert wird 7.4.0. Offensichtlich ist das eine bahnbrechende Veränderung, also pass auf dich auf n stable. Alternativ wird sudo n ltsdas neueste LTS installiert.
jfmercer

1
Funktioniert auf Centos 6.5. Früher erhielt ich den folgenden Fehler "SyntaxError: Verwendung von const im strengen Modus". Danke
Himanshu Chauhan

1
Dies löste das Problem für mich auf einem älteren Computer, auf dem das Flag --harmony dies nicht tat. Setup: Der Versuch, einen Bildschirm-npm-Startmonitor mithilfe von Skripten in crontab zu starten, verursachte den strengen Fehler, bei dem das Ausführen über die CLI nicht auftrat. Die vorherige Knotenversion war 0.10.48 unter Ubuntu 12.04.5 LTS. Ich habe diesen Schritt befolgt und den Softlink / usr / bin / node von / etc / alternatives / node in /usr/local/n/versions/node/8.0 geändert .0 / bin / node und alles hat gerade funktioniert. Danke dafür!
Brian Layman

1
Badass, danke dafür, es hat nicht nur dieses Problem gelöst, sondern auch all die kleinen Schwächen beim Bau von SCA Local
jk121960

22

Normalerweise tritt dieser Fehler auf, wenn die Version des Knotens, für den der Code ausgeführt wird, älter als erwartet ist. (dh 0,12 oder älter).

Wenn Sie nvm verwenden, stellen Sie bitte sicher, dass Sie die richtige Version des verwendeten Knotens haben. Sie können die Kompatibilität auf node.green für const im strengen Modus überprüfen

Ich habe ein ähnliches Problem in einem anderen Beitrag gefunden und dort meine Antwort ausführlich veröffentlicht


1
Ich bin darauf gestoßen, als ich mein Node-Projekt in WebStorm ausgeführt habe. Auf meiner lokalen Version im Repo wurde Node 8.2.1 ausgeführt, aber WebStorm sah sich meinen /usr/bin/nodeOrdner mit 0.10.46 an.
Shadoninja

20

Ein wichtiger Schritt nach dem Aktualisieren Ihres Knotens besteht darin, Ihre Knotenbinärdatei mit der neuesten installierten Knotenversion zu verknüpfen

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

1
Wie kann ich herausfinden, welche Version gerade installiert wurde?
Jose Llausas

1
Sie können herausfinden, wo Ihre aktuelle Version des Knotens installiert ist, indem Siewhich node
Steve

Außerdem haben Sie das Verzeichnis gesehen, wenn Sie "n stabile" ausgeführt haben. In dieser Zeile: mkdir: /usr/local/n/versions/node/8.0.0 Sie können also einfach zu / usr / local / n / version / node / gehen. und sehen, welche Verzeichnisse existieren.
Brian Layman

@JoseLlausas node --versiondruckt die Versionsnummer aus, zBv0.10.29
Markus

15

Dies ist wahrscheinlich nicht die Lösung für alle, aber es war für mich.

Wenn Sie NVM verwenden, haben Sie möglicherweise nicht die richtige Version des Knotens für den von Ihnen ausgeführten Code aktiviert. Nach dem Neustart ändert sich Ihre Standardversion des Knotens wieder in die Systemstandardversion.

Ich bin darauf gestoßen, als ich mit React-Native gearbeitet habe, was gut funktioniert hat. Verwenden Sie einfach nvm, um die richtige Version des Knotens zu verwenden, um dieses Problem zu lösen.


2
und irgendeinen Code, um Ihre oben angegebene "Lösung" zu veranschaulichen?
Kermit_ice_tea

Ja, das war meine erste Ausgabe. obwohl ich sowieso wegen Kompatibilitätsproblemen mit Knoten und gcc-Version auf einer veralteten Centos-Version zu einem anderen Linux-Server wechseln musste.
Robot70

@Kermit_ice_tea Der gleiche Code in der Frage. Der Fehler befindet sich in der Version des Knotens. Wenn Sie NVM verwenden, um ihn auf eine Version zu setzen, die diesen Fehler nicht aufweist, wird dieser Code übergeben. nvm use version-number-you-needist alles was du tun musst.
Bootscodierer

8

Seit dem Zeitpunkt, an dem die Frage gestellt wurde, ist der Entwurf für das constSchlüsselwort bereits im Rahmen von ECMAScript 2015 ein Lebensstandard . Auch die aktuelle Version von Node.js unterstützt const-Deklarationen ohne das --harmonyFlag.

Mit dem oben Gesagten können Sie jetzt laufen node app.jsmit app.js:

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

Erhalten Sie sowohl die Syntax Zucker als auch die Vorteile des strengen Modus.


Ein Megabyte MBist eine Zehnerpotenz, während ein Mebibyte MiBeine Zweierpotenz ist. dh 1MB = 1e6und 1MiB = 1024 * 1024. Siehe Wikipedia: Mebibyte
DJDaveMark

0

Ich hatte kürzlich ein ähnliches Problem und landete in diesem Q & A. Dies ist nicht die Lösung, nach der das OP gesucht hat, kann aber anderen bei einem ähnlichen Problem helfen.

Ich verwende PM2 , um ein Projekt auszuführen, und auf einem bestimmten Staging-Server hatte ich eine wirklich alte Version von Node, NPM und PM2. Ich habe alles aktualisiert, aber den gleichen Fehler beibehalten:

SyntaxError: Verwendung von const im strengen Modus.

Ich habe mehrmals versucht, die Anwendung zu stoppen und zu starten. Auch versucht, alles erneut zu aktualisieren. Nichts hat geklappt. Bis ich beim Laufen eine Warnung bemerkte pm2 start:

>>>> In-Memory-PM2 ist veraltet.
Führen Sie folgende Schritte aus : >>>> $ pm2-Update
In-Memory-PM2-Version: 0.15.10
Lokale PM2-Version: 3.2.9

Erwischt! Nach dem Ausführen pm2 updatekonnte ich die Anwendung endlich wie erwartet zum Laufen bringen. Keine "const in strict mode" -Fehler mehr.


-2

const wird von ECMAScript nicht unterstützt. Nachdem Sie den strengen Modus angegeben haben, wird ein Syntaxfehler angezeigt. Sie müssen var anstelle von const verwenden, wenn Ihr Code mit allen Browsern kompatibel sein soll. Ich weiß, nicht die ideale Lösung, aber es ist, was es ist. Es gibt Möglichkeiten, schreibgeschützte Eigenschaften in JavaScript zu erstellen (siehe Können schreibgeschützte Eigenschaften in reinem JavaScript implementiert werden? ), Aber ich denke, dass dies je nach Szenario möglicherweise zu viel des Guten ist.

Unten finden Sie einen Hinweis zur Browserkompatibilität von MDN :

Browser-Kompatibilität

Die aktuelle Implementierung von const ist eine Mozilla-spezifische Erweiterung und nicht Teil von ECMAScript 5. Sie wird in Firefox & Chrome (V8) unterstützt. Wenn Sie in Safari 5.1.7 und Opera 12.00 eine Variable mit const in diesen Browsern definieren, können Sie ihren Wert später noch ändern. Es wird in Internet Explorer 6-10 nicht unterstützt, ist jedoch in Internet Explorer 11 enthalten. Das Schlüsselwort const deklariert derzeit die Konstante im Funktionsbereich (wie mit var deklarierte Variablen).

Firefox löst mindestens seit Version 13 einen TypeError aus, wenn Sie eine Konstante neu deklarieren. Keiner der Hauptbrowser erzeugt Hinweise oder Fehler, wenn Sie einer Konstanten einen anderen Wert zuweisen. Der Rückgabewert einer solchen Operation ist der des neu zugewiesenen Werts, aber die Neuzuweisung ist nur in Firefox und Chrome (zumindest seit Version 20) nicht erfolgreich.

const wird in ECMAScript 6 definiert, jedoch mit unterschiedlicher Semantik. Ähnlich wie bei Variablen, die mit der let-Anweisung deklariert wurden, werden Konstanten, die mit const deklariert wurden, blockiert.


3
constwird in ECMAScript 6 unterstützt und wird weitgehend unterstützt: kangax.github.io/compat-table/es6/#const Aber Sie haben Recht mit Ihrer Antwort - 'use strict';und constmischen sich nicht.
dotnetCarpenter

Ein schneller Test zeigt, dass constdies in Safari 7 erneut deklariert werden kann, jedoch nicht in Opera 21, Chrome 35 und Firefox 29.
dotnetCarpenter

21
Durchsuchen Kompatibilität ist kein
Problem

-2

Die Verwendung constim strengen Modus ist mit der Veröffentlichung von Chrome 41 verfügbar. Derzeit ist Chrome 41 Beta bereits veröffentlicht und unterstützt diese.


6
Zur Verdeutlichung wollte ich kommentieren, dass die Browserkompatibilität nicht relevant ist, da das OP nach Node.js gefragt hat. Doch irgendwie hatte die Antwort 4 positive Stimmen und verdeckte andere relevantere Antworten.
Dan Dascalescu

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

Für Linux Server
Ayhmi

1
Willkommen bei Stack Overflow. Wenn Sie eine Antwort beisteuern, geben Sie am besten sowohl Code als auch eine Erklärung an.
O. Jones

2
Abwahl, weil es keine Erklärung gibt. warum Kirchenschiff Paket installiert werden sollte ..
Sean83

Warum sollte eine solche Lösung funktionieren? Eine Erklärung ist erforderlich.
Paul Isaris

Obwohl es keine Erklärung gibt, wurde der Fehler für mich erst behoben, nachdem die hier beschriebenen Befehle ausgeführt wurden: npm install -g nave; nave use 6.11.1 +1
Ruben Alves
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.