SyntaxError: uso de const en modo estricto

241

Estoy trabajando con Node.js, y en una de mis archivos js que estoy usando consten "strict mode". Cuando intento ejecutarlo, recibo un error:

SyntaxError: Use of const in strict mode.

¿Cuál es la mejor práctica para hacer esto?

Editar:

'use strict'
const MAX_IMAGE_SIZE = 1024*1024; // 1 MB
Vivek P
fuente
@thefourtheye check en cromo, ff está funcionando bien.
Zaheer Ahmed
uso var. Añadir semikolon'use strict';
Adrian Preuss
@ZaheerAhmed En realidad estoy usando Node.js yaar. Funciona bien en eso.
thefourtheye
Aah ... falla en ideone.com
thefourtheye
Después de actualizar la última versión de Node v5.3.0, ahora funciona bien.
zangw

Respuestas:

284

Los consty letson parte de ECMAScript 2015 (también conocido como ES6 y Harmony), y no se habilitó de forma predeterminada en Node.js 0.10 o 0.12. Desde Node.js 4.x, "Todas las funciones de envío [ES2015], que V8 considera estable, están activadas de forma predeterminada en Node.js y NO requieren ningún tipo de indicador de tiempo de ejecución". Node.js docs tiene una descripción general de qué funciones de ES2015 están habilitadas de manera predeterminada y cuáles requieren un indicador de tiempo de ejecución . Entonces, al actualizar a Node.js 4.xo posterior, el error debería desaparecer.

Para habilitar algunas de las características de ECMAScript 2015 (incluyendo consty let) en Node.js 0.10 y 0.12; inicie su programa de nodo con un indicador de armonía, de lo contrario obtendrá un error de sintaxis. Por ejemplo:

node --harmony app.js

Todo depende de qué lado se encuentre tu js estricto. Recomendaría usar el modo estricto con constdeclaraciones en el lado del servidor e iniciar el servidor con la bandera de armonía. Para el lado del cliente, debe usar Babel o una herramienta similar para convertir ES2015 a ES5, ya que no todos los navegadores de clientes admiten las constdeclaraciones.

Alejandro
fuente
8
Esta es la respuesta más completa y relevante.
zamnuts
El modo estricto también se puede aplicar usando un nodo de indicador (en lugar de una expresión literal) --armonía --use_strict app.js Lo cual es bueno.
Adria
77
Me gustaría aconsejar que no se use el indicador "use_strict". Está ejecutando el código de otra persona en un intérprete para el que no fue escrito. Siempre 'use strict';úselo, pero deje que el código de terceros decida por sí mismo.
Thomas Jensen
1
FWIW He encontrado el mismo problema al ejecutar el nodo v8.1 pero la versión armfh (raspberry pi).
James
238

Si esto sucede en nodejs, se debe a la versión anterior de nodejs. Actualizar nodo utilizando,

1) Borrar el caché de NPM:

sudo npm cache clean -f

2) Instale un pequeño ayudante llamado 'n'

sudo npm install -g n

3) Instale la última versión estable de NodeJS

sudo n stable

Actualice las instrucciones de nodejs tomadas de https://stackoverflow.com/a/19584407/698072

Desconocido
fuente
3
Obtuve este "npm ERR! Notsup No compatible npm ERR! Notsup No es compatible con su sistema operativo o arquitectura: [email protected]" al intentar hacer el paso 2. Buenos momentos.
VSO
1
Dependiendo de su caso de uso, puede ser más seguro especificar la nodeversión. Por ejemplo, al momento de escribir esto, sudo n 6.9.4instalará el último LTS, donde sudo n stablese instalará 7.4.0. Obviamente, ese es un cambio radical, así que ten cuidado n stable. Alternativamente, sudo n ltsinstala el LTS más reciente.
jfmercer
1
Funciona en centos 6.5. Anteriormente recibía el siguiente error "SyntaxError: uso de const en modo estricto". Gracias
Himanshu Chauhan
1
Esto resolvió el problema para mí en una máquina heredada donde la bandera --armonía no lo hizo. Configuración: Intentar iniciar un monitor de inicio de pantalla npm usando scripts en crontab causó el estricto error donde no se ejecutaba desde el cli. La versión anterior del nodo era 0.10.48 ejecutándose en Ubuntu 12.04.5 LTS Seguí este paso y el que cambiaba el enlace suave / usr / bin / node de / etc / alternative / node a /usr/local/n/versions/node/8.0 .0 / bin / node y todo simplemente funcionó. ¡Gracias por esto!
Brian Layman
1
Badass gracias por esto, no sólo se resolvió el problema, pero todas las debilidades inherentes en la construcción de pequeños SCA local
jk121960
22

Por lo general, este error ocurre cuando la versión del nodo en el que se ejecuta el código es anterior a la esperada. (es decir, 0,12 o más).

si está utilizando nvm, asegúrese de tener la versión correcta del nodo que está utilizando. Puede verificar la compatibilidad en node.green para const en modo estricto

Encontré un problema similar en otra publicación y publiqué mi respuesta allí en detalle

GG
fuente
1
Me encontré con esto cuando ejecuté mi proyecto Node en WebStorm. Mi versión local en el repositorio estaba ejecutando el Nodo 8.2.1, pero WebStorm miró mi /usr/bin/nodecarpeta, que tenía 0.10.46.
Shadoninja
20

Un paso importante después de actualizar su nodo es vincular su nodo binario a la última versión de nodo instalada

sudo ln -sf /usr/local/n/versions/node/6.0.0/bin/node /usr/bin/node  
Shri Shinde
fuente
1
¿Cómo puedo averiguar qué versión acaba de instalar?
Jose Llausas
1
Puede encontrar dónde está instalada su versión actual de nodo ejecutandowhich node
Steve
También habrá visto el directorio cuando ejecute "n estable" En esta línea: mkdir: /usr/local/n/versions/node/8.0.0 Así que puede ir a / usr / local / n / version / node / y ver qué directorios existen.
Brian Layman
@JoseLlausas node --versionimprime el número de versión, por ejemplov0.10.29
Markus
15

Probablemente esta no sea la solución para todos, pero fue para mí.

Si está utilizando NVM, es posible que no haya habilitado la versión correcta del nodo para el código que está ejecutando. Después de reiniciar, su versión predeterminada del nodo vuelve a ser la predeterminada del sistema.

Me encontraba con esto cuando trabajaba con react-native que había estado funcionando bien. Simplemente use nvm para usar la versión correcta del nodo para resolver este problema.

codificador de barcos
fuente
2
y algún código para ilustrar su "solución" declarada arriba?
Kermit_ice_tea
Sí, este fue mi problema inicial. aunque tuve que cambiar a otro servidor de Linux de todos modos debido a problemas de compatibilidad de versiones de nodo y gcc en una versión obsoleta de centos.
Robot70
@Kermit_ice_tea El mismo código en la pregunta. El error está en la versión del nodo, usando NVM para configurarlo en una versión que no tiene ese error hace que ese código pase. nvm use version-number-you-needes todo lo que tienes que hacer
Boatcoder
8

Desde el momento en que se hizo la pregunta, el borrador de la constpalabra clave ya es un estándar de vida como parte de ECMAScript 2015 . Además, la versión actual de Node.js admite declaraciones constantes sin el--harmony bandera.

Con lo anterior, ahora puede ejecutar node app.js, con app.js:

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

obteniendo tanto el azúcar de sintaxis como los beneficios del modo estricto.

dodev
fuente
Un megabyte MBes una potencia de diez, mientras que un mebibyte MiBes una potencia de dos. es decir 1MB = 1e6y 1MiB = 1024 * 1024. Ver wikipedia: Mebibyte
DJDaveMark
0

Tuve un problema similar recientemente y terminé en estas preguntas y respuestas. Esta no es la solución que estaba buscando el OP, pero puede ayudar a otros con un problema similar.

Estoy usando PM2 para ejecutar un proyecto y en un servidor de ensayo determinado tenía una versión muy antigua de Node, NPM y PM2. Actualicé todo, sin embargo, seguí manteniendo el mismo error:

SyntaxError: uso de const en modo estricto.

Traté de detener e iniciar la aplicación varias veces. También trató de actualizar todo de nuevo. Nada funcionó. Hasta que noté una advertencia cuando corrí pm2 start:

>>>> PM2 en memoria no está actualizado, haga:
>>>> actualización $ pm2
en memoria PM2: 0.15.10
Versión PM2 local: 3.2.9

Gotcha! Después de ejecutar pm2 update, finalmente pude hacer que la aplicación se ejecutara como se esperaba. Ya no hay errores de "const en modo estricto".

Gustavo Straube
fuente
-2

const no es compatible con ECMAScript. Entonces, después de especificar el modo estricto, obtiene un error de sintaxis. Debe usar var en lugar de const si desea que su código sea compatible con todos los navegadores. Lo sé, no es la solución ideal, pero es lo que es. Hay formas de crear propiedades de solo lectura en JavaScript (consulte ¿Se pueden implementar las propiedades de solo lectura en JavaScript puro? ), Pero creo que puede ser excesivo dependiendo de su escenario.

A continuación se muestra la nota de compatibilidad del navegador de MDN :

Compatibilidad del navegador

La implementación actual de const es una extensión específica de Mozilla y no forma parte de ECMAScript 5. Es compatible con Firefox y Chrome (V8). A partir de Safari 5.1.7 y Opera 12.00, si define una variable con const en estos navegadores, aún puede cambiar su valor más adelante. No se admite en Internet Explorer 6-10, pero se incluye en Internet Explorer 11. La palabra clave const actualmente declara la constante en el alcance de la función (como las variables declaradas con var).

Firefox, al menos desde la versión 13, arroja un TypeError si redeclara una constante. Ninguno de los principales navegadores produce avisos o errores si asigna otro valor a una constante. El valor de retorno de dicha operación es el del nuevo valor asignado, pero la reasignación no tiene éxito solo en Firefox y Chrome (al menos desde la versión 20).

const será definido por ECMAScript 6, pero con una semántica diferente. De manera similar a las variables declaradas con la declaración let, las constantes declaradas con const tendrán un alcance de bloque.

Shital Shah
fuente
3
constes compatible con ECMAScript 6 y es ampliamente compatible: kangax.github.io/compat-table/es6/#const Pero tiene razón en su respuesta, 'use strict';y constno se mezcla.
dotnetCarpenter
Una prueba rápida muestra que constse puede volver a declarar en Safari 7 pero no en Opera 21, Chrome 35 y Firefox 29.
dotnetCarpenter
21
La compatibilidad de
navegación
-2

El uso de consten modo estricto está disponible con el lanzamiento de Chrome 41. Actualmente, Chrome 41 Beta ya está disponible y lo admite.

morkro
fuente
66
Solo para aclarar, quería comentar que dado que el OP solicitó Node.js, la compatibilidad del navegador no es relevante. Sin embargo, de alguna manera, la respuesta tuvo 4 votos a favor, y oscureció otras respuestas más relevantes.
Dan Dascalescu
-3
cd /
npm install -g nave
nave use 6.11.1
node app.js
Ayhmi
fuente
Para el servidor Linux
Ayhmi
1
Bienvenido a Stack Overflow. Al aportar una respuesta, es mejor dar un código y una explicación.
O. Jones
2
Voto negativo porque no hay explicación. qué paquete nave debe ser instalado ..
Sean83
¿Por qué funcionaría tal solución? Se necesita una explicación.
Paul Isaris
Aunque no hay explicación, para mí el error solo se resolvió después de ejecutar los comandos descritos aquí: npm install -g nave; nave use 6.11.1 +1
Ruben Alves