SyntaxError: Uso de const no modo estrito

241

Eu estou trabalhando com node.js, e em um dos meus arquivos js eu estou usando constno "strict mode". Ao tentar executá-lo, estou recebendo um erro:

SyntaxError: Use of const in strict mode.

Qual é a melhor prática para fazer isso?

Editar:

'use strict'
const MAX_IMAGE_SIZE = 1024*1024; // 1 MB
Vivek P
fonte
@thefourtheye check in chrome, ff está funcionando bem.
Zaheer Ahmed
use var. Adicionar ponto-'use strict';
Adrian Preuss
@ZaheerAhmed Na verdade, estou usando o Node.js yaar. Funciona bem nisso.
thefourtheye
Aah ... falha em ideone.com
thefourtheye
Depois de atualizar a versão mais recente do Node v5.3.0, ela funciona bem agora.
zangw

Respostas:

284

O conste letfaz parte do ECMAScript 2015 (também conhecido como ES6 e Harmony) e não foi ativado por padrão no Node.js. 0.10 ou 0.12. Desde o Node.js. 4.x, “Todos os recursos de remessa [ES2015], que a V8 considera estáveis, são ativados por padrão no Node.js. NÃO requerem nenhum tipo de sinalizador de tempo de execução.”. Os documentos do Node.js têm uma visão geral dos recursos do ES2015 ativados por padrão e de quem exige um sinalizador de tempo de execução . Portanto, atualizando para o Node.js.x ou mais recente, o erro deve desaparecer.

Para habilitar alguns dos recursos do ECMAScript 2015 (incluindo conste let) no Node.js. 0.10 e 0.12; inicie o programa do nó com um sinalizador de harmonia, caso contrário, você receberá um erro de sintaxe. Por exemplo:

node --harmony app.js

Tudo depende de qual lado seu js estrito está localizado. Eu recomendaria usar o modo estrito com constdeclarações no lado do servidor e iniciar o servidor com o sinalizador de harmonia. Para o lado do cliente, você deve usar o Babel ou uma ferramenta semelhante para converter o ES2015 para o ES5, pois nem todos os navegadores do cliente suportam as constdeclarações.

Alexander
fonte
8
Esta é a resposta mais completa e relevante.
zamnuts
O modo estrito também pode ser aplicado usando um nó de flag (em vez de uma expressão literal) --harmony --use_strict app.js O que é legal.
Adria
7
Gostaria de aconselhar contra o uso do sinalizador "use_strict". Está executando o código de outra pessoa em um intérprete para o qual não foi escrito. Sempre use 'use strict';você mesmo, mas deixe o código de terceiros decidir por si mesmo.
Thomas Jensen
1
FWIW Encontrei o mesmo problema executando o nó v8.1, mas a versão armfh (raspberry pi).
James
238

Se isso estiver acontecendo no nodejs, é devido à versão mais antiga do nodejs. Atualize o nó usando,

1) Limpe o cache do NPM:

sudo npm cache clean -f

2) Instale um pequeno ajudante chamado 'n'

sudo npm install -g n

3) Instale a versão estável mais recente do NodeJS

sudo n stable

Atualize as instruções do nodejs obtidas em https://stackoverflow.com/a/19584407/698072

Desconhecido
fonte
3
Eu recebi esse "npm ERR! Notsup Não suportado npm ERR! Notsup Não é compatível com o sistema operacional ou a arquitetura: [email protected]" ao tentar executar a etapa 2. Bons tempos.
VSO
1
Dependendo do seu caso de uso, você pode achar mais seguro especificar a nodeversão. Por exemplo, no momento da redação deste documento, sudo n 6.9.4instalará o LTS mais recente, onde sudo n stableserá instalado 7.4.0. Obviamente, essa é uma mudança radical, então tome cuidado n stable. Como alternativa, sudo n ltsinstala o LTS mais recente.
jfmercer
1
Funciona em centos 6.5. Anteriormente, estava recebendo o seguinte erro "SyntaxError: Uso de const no modo estrito". Obrigado
Himanshu Chauhan
1
Isso resolveu o problema para mim em uma máquina legada em que a bandeira --harmony não. Configuração: a tentativa de iniciar uma tela npm start monitor usando scripts no crontab causou o erro estrito que a execução do cli não causou. A versão anterior do nó era 0.10.48 em execução no ubuntu 12.04.5 LTS. Segui esta etapa e a que mudou o softlink / usr / bin / node de / etc / alternative / node para /usr/local/n/versions/node/8.0 .0 / bin / node e tudo apenas funcionou. Obrigado por isso!
Brian Layman
1
Badass obrigado por isso, não só resolveu o problema, mas todas as fraquezas pequenas inerentes ao construir SCA local
jk121960
22

Geralmente, esse erro ocorre quando a versão do nó no qual o código está sendo executado é mais antiga que o esperado. (ou seja, 0,12 ou mais).

Se você estiver usando o nvm, verifique se a versão correta do nó está sendo usada. Você pode verificar a compatibilidade em node.green para const no modo estrito

Encontrei um problema semelhante em outro post e postei minha resposta em detalhes

GG
fonte
1
Eu me deparei com isso ao executar meu projeto Node no WebStorm. Minha versão local no repositório estava executando o Nó 8.2.1, mas o WebStorm olhou para a minha /usr/bin/nodepasta, que tinha 0.10.46.
Shadoninja 30/03
20

Uma etapa importante após a atualização do nó é vincular o binário do nó à versão mais recente do nó instalado

sudo ln -sf /usr/local/n/versions/node/6.0.0/bin/node /usr/bin/node  
Shri Shinde
fonte
1
Como posso descobrir qual versão foi instalada?
Jose Llausas
1
Você pode descobrir onde sua versão atual do nó está instalada executandowhich node
Steve
Você também verá o diretório ao executar "n stable" Nesta linha: mkdir: /usr/local/n/versions/node/8.0.0 Então, você pode simplesmente acessar / usr / local / n / versions / node / e veja quais diretórios existem.
Brian Layman
@JoseLlausas node --versionimprime o número da versão, por exemplov0.10.29
Markus
15

Provavelmente, essa não é a solução para todos, mas foi para mim.

Se você estiver usando o NVM, talvez não tenha ativado a versão correta do nó para o código que está executando. Após a reinicialização, sua versão padrão do nó volta ao padrão do sistema.

Estava enfrentando isso ao trabalhar com o react-native, que estava funcionando bem. Basta usar o nvm para usar a versão correta do nó para resolver esse problema.

boatcoder
fonte
2
e algum código para ilustrar sua "solução" declarada acima?
29516 Kermit_ice_tea
Sim, esse foi meu problema inicial. embora eu tivesse que mudar para outro servidor linux de qualquer maneira devido a problemas de compatibilidade de versão de nó e gcc em uma versão desatualizada do centos.
Robot70
@Kermit_ice_tea O mesmo código na pergunta. O bug está na versão do nó, usando o NVM para defini-lo como uma versão que não possui esse bug e faz com que o código seja transmitido. nvm use version-number-you-needé tudo o que você precisa fazer.
boatcoder
8

Desde o momento em que a pergunta foi feita, o rascunho da constpalavra-chave já é um padrão de vida como parte do ECMAScript 2015 . Além disso, a versão atual do Node.js suporta declarações const sem o--harmony sinalizador.

Com o exposto acima, agora você pode executar node app.js, com app.js:

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

obtendo o açúcar da sintaxe e os benefícios do modo estrito.

dodev
fonte
Um megabyte MBé uma potência de dez, enquanto um mebibyte MiBé uma potência de dois. ie 1MB = 1e6e 1MiB = 1024 * 1024. Veja wikipedia: Mebibyte
DJDaveMark 5/11
0

Recentemente, tive um problema semelhante e terminei nesta sessão de perguntas e respostas. Essa não é a solução que o OP estava procurando, mas pode ajudar outras pessoas com um problema semelhante.

Estou usando o PM2 para executar um projeto e em um determinado servidor de temporariedade eu tinha uma versão muito antiga do Node, NPM e PM2. Atualizei tudo, no entanto, continuei mantendo o mesmo erro:

SyntaxError: uso de const no modo estrito.

Tentei parar e iniciar o aplicativo várias vezes. Também tentei atualizar tudo novamente. Nada funcionou. Até notar um aviso quando corri pm2 start:

>>>> PM2 na memória está desatualizado, faça:
>>>> $ pm2 update
Na versão do PM2 na memória: 0.15.10
Versão do PM2 local: 3.2.9

Peguei vocês! Após a execução pm2 update, finalmente consegui executar o aplicativo conforme o esperado. Não há mais erros "const no modo estrito".

Gustavo Straube
fonte
-2

const não é suportado pelo ECMAScript. Então, depois de especificar o modo estrito, você recebe um erro de sintaxe. Você precisa usar var em vez de const se quiser que seu código seja compatível com todos os navegadores. Eu sei, não a solução ideal, mas é o que é. Existem maneiras de criar propriedades somente leitura em JavaScript (consulte As propriedades somente leitura podem ser implementadas em JavaScript puro? ), Mas acho que pode ser um exagero, dependendo do seu cenário.

Abaixo está a nota de compatibilidade do navegador da MDN :

Compatibilidade do navegador

A implementação atual do const é uma extensão específica da Mozilla e não faz parte do ECMAScript 5. É suportada no Firefox & Chrome (V8). No Safari 5.1.7 e Opera 12.00, se você definir uma variável com const nesses navegadores, ainda poderá alterar seu valor posteriormente. Ele não é suportado no Internet Explorer 6-10, mas está incluído no Internet Explorer 11. A palavra-chave const atualmente declara a constante no escopo da função (como variáveis ​​declaradas com var).

O Firefox, pelo menos desde a versão 13, lança um TypeError se você redeclarar uma constante. Nenhum dos principais navegadores produz avisos ou erros se você atribuir outro valor a uma constante. O valor de retorno dessa operação é o do novo valor atribuído, mas a reatribuição não é bem-sucedida apenas no Firefox e Chrome (pelo menos desde a versão 20).

const será definido pelo ECMAScript 6, mas com diferentes semânticas. Semelhante às variáveis ​​declaradas com a instrução let, as constantes declaradas com const terão o escopo do bloco.

Shital Shah
fonte
3
consté suportado no ECMAScript 6 e é amplamente suportado: kangax.github.io/compat-table/es6/#const Mas você está certo na sua resposta - 'use strict';e constnão se mistura.
DotnetCarpenter
Um teste rápido mostra que consté re-declarável no Safari 7, mas não no Opera 21, Chrome 35 e Firefox 29.
dotnetCarpenter
21
A compatibilidade de
navegação
-2

O uso de const no modo estrito está disponível com o lançamento do Chrome 41. Atualmente, o Chrome 41 Beta já foi lançado e o suporta.

morkro
fonte
6
Apenas para esclarecer, gostaria de comentar que, como o OP solicitou o Node.js, a compatibilidade do navegador não é relevante. No entanto, de alguma forma, a resposta teve quatro votos positivos e obscureceu outras respostas mais relevantes.
Dan Dascalescu
-3
cd /
npm install -g nave
nave use 6.11.1
node app.js
Ayhmi
fonte
Para servidor Linux
Ayhmi
1
Bem-vindo ao Stack Overflow. Ao contribuir com uma resposta, é melhor fornecer um código e uma explicação.
O. Jones
2
Voto negativo, porque não há explicação. por pacote nave deve ser instalado ..
Sean83
Por que essa solução funcionaria? É necessária uma explicação.
Paul Isaris 26/10
Embora não haja explicação, para mim o erro foi resolvido após a execução dos comandos descritos aqui: npm install -g nave; nave use 6.11.1 +1
Ruben Alves