SyntaxError: uso di const in modalità rigorosa


241

Sto lavorando con node.js, e in uno dei miei file js che sto utilizzando constin "strict mode". Quando provo a eseguirlo, visualizzo un errore:

SyntaxError: Use of const in strict mode.

Qual è la migliore pratica per farlo?

Modificare:

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

@thefourtheye controlla in cromo, ff funziona bene.
Zaheer Ahmed,

usare var. Aggiungi semikolon'use strict';
Adrian Preuss il

@ZaheerAhmed In realtà sto usando Node.js yaar. Funziona bene in questo.
theourourye

Aah ... Fallisce in ideone.com
thefourtheye

Dopo aver aggiornato l'ultima versione del Nodo v5.3.0, ora funziona bene.
zangw,

Risposte:


284

The conste letfanno parte di ECMAScript 2015 (aka ES6 e Harmony) e non sono stati abilitati per impostazione predefinita in Node.js 0.10 o 0.12. A partire da Node.js 4.x, "Tutte le funzionalità di spedizione [ES2015], che V8 considera stabili, sono attivate per impostazione predefinita su Node.js e NON richiedono alcun tipo di flag di runtime.". I documenti Node.js hanno una panoramica di quali funzionalità ES2015 sono abilitate per impostazione predefinita e quali richiedono un flag di runtime . Quindi aggiornando a Node.js 4.xo versioni successive l'errore dovrebbe scomparire.

Per abilitare alcune delle funzionalità di ECMAScript 2015 (inclusi conste let) in Node.js 0.10 e 0.12; avviare il programma del nodo con un flag di armonia, altrimenti verrà visualizzato un errore di sintassi. Per esempio:

node --harmony app.js

Tutto dipende da quale parte si trova la tua js rigorosa. Consiglierei di utilizzare la modalità rigorosa con le constdichiarazioni sul lato server e avviare il server con il flag harmony. Per il lato client, è necessario utilizzare Babel o uno strumento simile per convertire ES2015 in ES5, poiché non tutti i browser client supportano le constdichiarazioni.


8
Questa è la risposta più completa e pertinente.
Zamnuts,

La modalità Strict può anche essere applicata usando un nodo flag (piuttosto che un'espressione letterale) --harmony --use_strict app.js Che è carino.
Adria,

7
Vorrei sconsigliare l'uso della bandiera "use_strict". Sta eseguendo il codice di qualcun altro in un interprete per cui non è stato scritto. Usa sempre 'use strict';te stesso, ma lascia che il codice di terze parti decida da solo.
Thomas Jensen,

1
FWIW Ho riscontrato lo stesso problema con il nodo v8.1 ma la versione armfh (raspberry pi).
James,

238

Se ciò accade in nodejs, è dovuto alla versione precedente di nodejs. Aggiorna nodo utilizzando,

1) Cancella la cache di NPM:

sudo npm cache clean -f

2) Installa un piccolo aiutante chiamato 'n'

sudo npm install -g n

3) Installa l'ultima versione stabile di NodeJS

sudo n stable

Aggiorna le istruzioni nodejs prese da, https://stackoverflow.com/a/19584407/698072


3
Ho ricevuto questo "npm ERR! Notsup Non supportato npm ERR! Notsup Non compatibile con il sistema operativo o l'architettura: n@2.1.4" durante il tentativo di eseguire il passaggio 2. Buoni tempi.
VSO,

1
A seconda del caso d'uso, potrebbe essere più sicuro specificare la nodeversione. Ad esempio, al momento della stesura di questo documento, sudo n 6.9.4verrà installato l'ultimo LTS, dove sudo n stableverrà installato 7.4.0. Ovviamente, questo è un cambiamento decisivo, quindi fai attenzione n stable. In alternativa, sudo n ltsinstalla il LTS più recente.
jfmercer,

1
Funziona su centos 6.5. In precedenza stavo ottenendo il seguente errore "SyntaxError: uso di const in modalità rigorosa". Grazie
Himanshu Chauhan

1
Ciò ha risolto il problema per me su una macchina legacy in cui la bandiera --harmony no. Installazione: Il tentativo di avviare uno schermo npm start monitor utilizzando gli script in crontab ha causato l'errore rigoroso in cui non è stato eseguito dal client. La versione precedente del nodo era 0.10.48 in esecuzione su Ubuntu 12.04.5 LTS Ho seguito questo passaggio e quello che ha cambiato il softlink / usr / bin / node da / etc / alternatives / node a /usr/local/n/versions/node/8.0 .0 / bin / node e tutto ha funzionato. Grazie per questo!
Brian Layman,

1
Grazie mille per questo, non solo ha risolto quel problema, ma tutti i piccoli problemi inerenti alla costruzione di SCA Local
jk121960,

22

In genere questo errore si verifica quando la versione del nodo su cui viene eseguito il codice è precedente al previsto. (ovvero 0,12 o precedente).

se si utilizza nvm, assicurarsi di disporre della versione corretta del nodo. Puoi verificare la compatibilità su node.green per const in modalità rigorosa

Ho riscontrato un problema simile in un altro post e ho pubblicato la mia risposta in dettaglio


1
Mi sono imbattuto in questo durante l'esecuzione del mio progetto Node in WebStorm. La mia versione locale nel repository stava eseguendo il nodo 8.2.1, ma WebStorm ha esaminato la mia /usr/bin/nodecartella, che aveva 0.10.46.
Shadoninja,

20

Un passaggio importante dopo l'aggiornamento del nodo è quello di collegare il nodo binario all'ultima versione del nodo installato

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

1
Come posso capire quale versione è appena stata installata?
Jose Llausas,

1
Puoi trovare dove è installata la tua versione attuale del nodo eseguendowhich node
Steve

Inoltre avrai visto la directory quando esegui "n stable" In questa riga: mkdir: /usr/local/n/versions/node/8.0.0 Quindi puoi semplicemente andare su / usr / local / n / version / node / e vedere quali directory esistono.
Brian Layman,

@JoseLlausas node --versionstampa il numero della versione, ad esv0.10.29
Markus il

15

Questa probabilmente non è la soluzione per tutti, ma è stata per me.

Se si utilizza NVM, è possibile che non si sia abilitata la versione corretta del nodo per il codice in esecuzione. Dopo il riavvio, la versione predefinita del nodo torna ai valori predefiniti del sistema.

Mi sono imbattuto in questo quando ho lavorato con reattivo nativo che aveva funzionato bene. Basta usare nvm per usare la versione corretta del nodo per risolvere questo problema.


2
e qualsiasi codice per illustrare la "soluzione" dichiarata sopra?
Kermit_ice_tea,

sì, questo era il mio problema iniziale. anche se ho dovuto passare a un altro server Linux a causa di problemi di compatibilità della versione di nodo e gcc su una versione non aggiornata di centos.
Robot70,

@Kermit_ice_tea Lo stesso codice nella domanda. Il bug è nella versione del nodo, usando NVM per impostarlo su una versione che non ha quel bug fa passare quel codice. nvm use version-number-you-needè tutto ciò che devi fare.
Boatcoder

8

Dal momento in cui è stata posta la domanda, la bozza della constparola chiave è già uno standard di vita nell'ambito di ECMAScript 2015 . Anche la versione corrente di Node.js supporta dichiarazioni const senza --harmonyflag.

Con quanto detto sopra ora puoi eseguire node app.js, con app.js:

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

ottenere sia lo zucchero della sintassi che i vantaggi della modalità rigorosa.


Un megabyte ha MBuna potenza di dieci, mentre un mebibyte ha MiBuna potenza di due. ie 1MB = 1e6e 1MiB = 1024 * 1024. Vedi Wikipedia: Mebibyte
DJDaveMark,

0

Ho avuto un problema simile di recente e sono finito in questo Q&A. Questa non è la soluzione che il PO stava cercando, ma può aiutare gli altri con un problema simile.

Sto usando PM2 per eseguire un progetto e in un determinato server di gestione temporanea avevo una versione davvero vecchia di Node, NPM e PM2. Ho aggiornato tutto, tuttavia, ho mantenuto lo stesso errore:

SyntaxError: uso di const in modalità rigorosa.

Ho provato a interrompere e avviare l'applicazione più volte. Ho anche provato ad aggiornare di nuovo tutto. Niente ha funzionato. Fino a quando ho notato un avviso quando ho corso pm2 start:

>>>> PM2 in memoria non è aggiornato, eseguire:
>>>> Aggiornamento $ pm2
In memoria Versione PM2: 0.15.10
Versione PM2 locale: 3.2.9

Gotcha! Dopo aver eseguito pm2 update, finalmente sono riuscito a far funzionare l'applicazione come previsto. Non ci sono più errori "const in modalità rigorosa".


-2

const non è supportato da ECMAScript. Quindi, dopo aver specificato la modalità rigorosa, viene visualizzato un errore di sintassi. È necessario utilizzare var anziché const se si desidera che il codice sia compatibile con tutti i browser. Lo so, non la soluzione ideale, ma è quello che è. Esistono modi per creare proprietà di sola lettura in JavaScript (vedi Le proprietà di sola lettura possono essere implementate in JavaScript puro? ) Ma penso che potrebbe essere eccessivo a seconda del tuo scenario.

Di seguito è riportata la nota di compatibilità del browser da MDN :

Compatibilità del browser

L'attuale implementazione di const è un'estensione specifica di Mozilla e non fa parte di ECMAScript 5. È supportata in Firefox e Chrome (V8). A partire da Safari 5.1.7 e Opera 12.00, se si definisce una variabile con const in questi browser, è comunque possibile modificarne il valore in un secondo momento. Non è supportato in Internet Explorer 6-10, ma è incluso in Internet Explorer 11. La parola chiave const attualmente dichiara la costante nell'ambito della funzione (come le variabili dichiarate con var).

Firefox, almeno dalla versione 13, genera un errore di tipo se si dichiara una costante. Nessuno dei principali browser produce avvisi o errori se si assegna un altro valore a una costante. Il valore di ritorno di tale operazione è quello del nuovo valore assegnato, ma la riassegnazione non ha esito positivo solo in Firefox e Chrome (almeno dalla versione 20).

const sarà definito da ECMAScript 6, ma con semantica diversa. Analogamente alle variabili dichiarate con l'istruzione let, le costanti dichiarate con const saranno nell'ambito del blocco.


3
constè supportato in ECMAScript 6 ed è ampiamente supportato: kangax.github.io/compat-table/es6/#const Ma hai ragione nella tua risposta 'use strict';e constnon si mescola.
dotnetCarpenter

Un rapido test mostra che constè ri-dichiarabile in Safari 7 ma non in Opera 21, Chrome 35 e Firefox 29.
dotnetCarpenter

21
Sfoglia la compatibilità non è un problema ... questo è Node.js
zamnuts,

-2

L'uso di constin modalità rigorosa è disponibile con il rilascio di Chrome 41. Attualmente, Chrome 41 Beta è già stato rilasciato e lo supporta.


6
Giusto per chiarire, volevo commentare che da quando l'OP ha richiesto Node.js, la compatibilità del browser non è rilevante. Eppure in qualche modo la risposta aveva 4 voti, e oscurava altre risposte più rilevanti.
Dan Dascalescu,

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

Per server Linux
Ayhmi,

1
Benvenuto in Stack Overflow. Quando contribuisci con una risposta, è meglio fornire sia del codice sia una spiegazione.
O. Jones,

2
Votazione negativa perché non c'è spiegazione. perché il pacchetto navata dovrebbe essere installato ..
Sean83

Perché una tale soluzione dovrebbe funzionare? È necessaria una spiegazione.
Paul Isaris,

Sebbene non ci siano spiegazioni, per me l'errore è stato risolto solo dopo aver eseguito i comandi descritti qui: npm install -g nave; nave use 6.11.1 +1
Ruben Alves
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.