Sözdizimi Hatası: Katı modda const kullanımı


241

Node.js ile çalışıyorum ve kullandığım js dosyalarımdan constbirinde "strict mode". Çalıştırmaya çalışırken bir hata alıyorum:

SyntaxError: Use of const in strict mode.

Bunu yapmak için en iyi uygulama nedir?

Düzenle:

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

@thefourtheye krom kontrol, ff iyi çalışıyor.
Zaheer Ahmed

kullanın var. Noktalı virgül ekle'use strict';
Adrian Preuss

@ZaheerAhmed Aslında Node.js yaar kullanıyorum. Bu iyi çalışıyor.
thefourtheye


En son Node v5.3.0 sürümünü güncelledikten sonra şimdi iyi çalışıyor.
zangw

Yanıtlar:


284

constVe let(ES6 ve Harmony aka) ECMAScript'e 2015 parçasıdır ve node.js 0.10 veya 0.12 varsayılan olarak etkin değildi. Node.js 4.x'ten beri, “V8'in kararlı olduğunu düşündüğü tüm gönderim [ES2015] özellikleri Node.js'de varsayılan olarak açıktır ve herhangi bir çalışma zamanı bayrağı GEREKMEZ.”. Node.js belgelerinde, varsayılan olarak hangi ES2015 özelliklerinin etkinleştirildiğine ve hangilerinin çalışma zamanı işareti gerektirdiğine ilişkin genel bir bakış vardır . Bu nedenle Node.js 4.x veya daha yeni bir sürüme geçerek hata ortadan kalkmalıdır.

(Dahil ECMAScript 2015 bazı özellikleri sağlamak için constve letnode.js 0.10 ve 0.12) 'de; düğüm programınıza bir uyum bayrağı ile başlayın, aksi takdirde bir sözdizimi hatası alırsınız. Örneğin:

node --harmony app.js

Her şey katı js'in hangi tarafa yerleştirildiğine bağlıdır. constSunucu tarafında bildirimlerle katı mod kullanmanızı ve sunucuyu uyum bayrağıyla başlatmanızı öneririm . İstemci tarafı için, ES2015'i ES5'e dönüştürmek için Babel veya benzer bir araç kullanmalısınız , çünkü tüm istemci tarayıcıları constbildirimleri desteklemez .


8
Bu en eksiksiz ve alakalı cevaptır.
zamnuts

Sıkı mod ayrıca bir bayrak (değişmez ifade yerine) düğümü kullanılarak da uygulanabilir - düğüm - harmony --use_strict app.js Bu güzel.
Adria

7
"Use_strict" bayrağını kullanmamaya karşı tavsiyede bulunmak istiyorum. Başka birinin kodunu yazılmadığı bir tercümanda çalıştırıyor. Her zaman 'use strict';kendinizi kullanın , ancak üçüncü taraf kodunun kendisi için karar vermesine izin verin.
Thomas Jensen

1
FWIW Aynı sorunu v8.1 düğümünü çalıştırırken buldum ama armfh sürümü (ahududu pi).
James

238

Bu nodej'lerde oluyorsa, bunun nedeni nodej'lerin eski versiyonudur. Düğümü kullanarak güncelle,

1) NPM'nin önbelleğini temizleyin:

sudo npm cache clean -f

2) 'n' adlı küçük bir yardımcı kurun

sudo npm install -g n

3) En son kararlı NodeJS sürümünü yükleyin

sudo n stable

Https://stackoverflow.com/a/19584407/698072 adresinden alınan nodejs talimatlarını güncelleyin


3
Bunu aldım "npm ERR! Notsup Desteklenmeyen npm ERR! Notsup İşletim sisteminiz veya mimarinizle uyumlu değil: n@2.1.4" 2. adımı gerçekleştirmeye çalışırken. İyi günler.
VSO

1
Kullanım durumunuza bağlı olarak, nodesürümü belirtmenin daha güvenli olduğunu görebilirsiniz . Örneğin, bu yazının yazıldığı tarih itibariyle, sudo n 6.9.4en son LTS'yi sudo n stableyükleyecektir 7.4.0. Açıkçası, bu kırıcı bir değişiklik, bu yüzden dikkatli olun n stable. Alternatif olarak, sudo n ltsen son LTS'yi kurar.
jfmercer

1
Centos üzerinde çalışır 6.5. Daha önce "SyntaxError: Sabit modda const kullanımı" hatası alıyordum. Teşekkürler
Himanshu Chauhan

1
Bu benim için --harmony bayrağının olmadığı eski bir makinede sorunu çözdü. Kurulum: crontab'daki komut dosyalarını kullanarak bir ekran npm başlangıç ​​monitörünü başlatmaya çalışmak, klipten çalıştırırken katı hataya neden oldu. Önceki düğüm sürümü ubuntu 12.04.5 LTS üzerinde çalışan 0.10.48 idi. Bu adımı takip ettim ve softlink / usr / bin / node / etc / alternuments / node /usus/local/n/versions/node/8.0 olarak değiştirildi .0 / bin / node ve her şey işe yaradı. Bunun için teşekkür ederim!
Brian Layman

1
Bunun için teşekkürler, sadece bu sorunu
çözmekle kalmadı, aynı zamanda

22

Genellikle bu hata, kodun yürütülmekte olduğu düğümün sürümü beklenenden daha eski olduğunda oluşur. (yani 0.12 veya daha eski).

Eğer nvm kullanıyorsanız lütfen kullanılan düğümün doğru sürümüne sahip olduğunuzdan emin olun. Sıkı mod altında const için node.green uyumluluğunu kontrol edebilirsiniz

Başka bir gönderide benzer bir sorun buldum ve cevabımı ayrıntılı olarak gönderdim


1
WebStorm'da Düğüm projemi çalıştırırken bu durumla karşılaştım. /usr/bin/nodeDepodaki yerel sürümüm Düğüm 8.2.1 çalıştırıyordu, ancak WebStorm 0.10.46 olan klasörüme baktı.
Shadoninja

20

Düğümünüzü güncelledikten sonra önemli bir adım, düğüm ikili dosyanızı en son yüklenen düğüm sürümüne bağlamaktır

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

1
Hangi sürümün yeni yüklendiğini nasıl anlayabilirim?
Jose Llausas

1
Geçerli düğüm sürümünüzün nerede yüklendiğini bulabilirsinizwhich node
Steve

Ayrıca "n kararlı" çalışırken dizini göreceksiniz Bu satırda: mkdir: /usr/local/n/versions/node/8.0.0 Böylece / usr / local / n / version / node / ve hangi dizinlerin mevcut olduğunu görün.
Brian Layman

@JoseLlausas node --version sürüm numarasını yazdırır örn.v0.10.29
Markus

15

Bu muhtemelen herkes için bir çözüm değil, ama benim içindi.

NVM kullanıyorsanız, çalıştırdığınız kod için düğümün doğru sürümünü etkinleştirmemiş olabilirsiniz. Yeniden başlattıktan sonra, varsayılan düğüm sürümünüz sistem varsayılanına geri döner.

İyi çalışıyordu tepki yerli ile çalışırken bu içine koşuyordu. Bu sorunu çözmek için düğümün doğru sürümünü kullanmak için nvm kullanın.


2
ve yukarıda belirttiğiniz "çözümü" göstermek için herhangi bir kod?
Kermit_ice_tea

evet, bu benim ilk sorunumdu. Her ne kadar eski bir centos sürümünde düğüm ve gcc sürüm uyumluluğu sorunları nedeniyle yine de başka bir linux sunucusuna geçmek zorunda kaldı.
Robot70

@Kermit_ice_tea Sorudaki aynı kod. Hata düğüm sürümünde, NVM kullanarak bu hataya sahip olmayan bir sürüme ayarlamak için bu kodu geçirir. nvm use version-number-you-needtek yapman gereken.
boatcoder

8

Sorunun sorulduğu zamandan bu yana, constanahtar kelime için taslak zaten ECMAScript 2015'in bir parçası olarak yaşayan bir standarttır . Ayrıca Node.js'nin geçerli sürümü , bayrağı olmayan sabit bildirimleri destekler--harmony .

Yukarıdaki ile artık çalıştırabilirsiniz söyledi node app.jsile app.js:

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

hem sentaks şekeri hem de katı modun faydalarını elde etmek.


Bir megabayt MBon güç, bir mebibit MiBise iki güçtür. yani 1MB = 1e6ve 1MiB = 1024 * 1024. Vikipedi: Mebibyte
DJDaveMark

0

Son zamanlarda benzer bir sorunum vardı ve bu soru-cevap bölümünde sona erdi. Bu OP'nin aradığı çözüm değil, benzer bir sorunu olan başkalarına da yardımcı olabilir.

Bir proje çalıştırmak için PM2 kullanıyorum ve belirli bir hazırlama sunucusunda Düğüm, NPM ve PM2 gerçekten eski bir sürümü vardı. Her şeyi güncelledim, ancak aynı hatayı sakladım:

Sözdizimi Hatası: Katı modda const kullanımı.

Uygulamayı birkaç kez durdurmaya ve başlatmaya çalıştım. Ayrıca her şeyi tekrar güncellemeye çalıştı. Hiçbir şey çalışmadı. Koştuğumda bir uyarı fark edene kadar pm2 start:

>>>> Bellek içi PM2 güncel değil, şunları yapın:
>>>> $ pm2 güncelleme
Bellek PM2 sürümünde: 0.15.10
Yerel PM2 sürümü: 3.2.9

Anladım! Çalıştırdıktan sonra pm2 update, uygulamayı beklediğim gibi çalıştırabildim. Artık "katı modda const" hatası yok.


-2

const ECMAScript tarafından desteklenmiyor. Bu nedenle, katı modu belirttikten sonra sözdizimi hatası alırsınız. Kodunuzun tüm tarayıcılarla uyumlu olmasını istiyorsanız const yerine var kullanmanız gerekir. Biliyorum, ideal çözüm değil, ama olan bu. JavaScript'te salt okunur özellikler oluşturmanın yolları vardır (bkz. Salt Okunur Özellikler Saf JavaScript'te Uygulanabilir mi? ) Ancak, senaryonuza bağlı olarak aşırıya kaçmış olabileceğini düşünüyorum.

MDN tarayıcı uyumluluk notu aşağıdadır :

Tarayıcı Uyumluluğu

Mevcut const uygulaması Mozilla'ya özgü bir uzantıdır ve ECMAScript 5'in bir parçası değildir. Firefox ve Chrome'da (V8) desteklenmektedir. Safari 5.1.7 ve Opera 12.00'dan itibaren, bu tarayıcılarda const içeren bir değişken tanımlarsanız, değerini daha sonra değiştirebilirsiniz. Internet Explorer 6-10'da desteklenmez, ancak Internet Explorer 11'de bulunur. Const anahtar sözcüğü şu anda işlev kapsamındaki sabiti bildirir (var ile bildirilen değişkenler gibi).

Firefox, en azından sürüm 13'ten beri, bir sabiti yeniden bildirirseniz TypeError atar. Bir sabite başka bir değer atarsanız, büyük tarayıcıların hiçbiri bildirim veya hata üretmez. Böyle bir işlemin dönüş değeri atanan yeni değerdir, ancak yeniden atama yalnızca Firefox ve Chrome'da başarısız olur (en azından sürüm 20'den beri).

const, ECMAScript 6 tarafından tanımlanacak, ancak farklı anlambilim ile tanımlanacaktır. Let deyimi ile bildirilen değişkenlere benzer şekilde, const ile bildirilen sabitler blok kapsamına alınır.


3
constECMAScript 6'da desteklenir ve yaygın olarak desteklenir: kangax.github.io/compat-table/es6/#const Ama cevabınızda haklısınız - 'use strict';ve constkarışmıyor.
dotnetCarpenter

Hızlı bir test, constSafari 7'de yeniden
beyan edilebildiğini

21
Uyumluluğa göz
atmanın


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

Linux sunucusu için
Ayhmi

1
Stack Overflow'a hoş geldiniz. Bir cevap katkı yaparken, bazı kod hem vermek en iyisidir ve bir açıklama.
O. Jones

2
Aşağı oy, çünkü bir açıklama yok.
Nefret

Böyle bir çözüm neden işe yarar? Bir açıklama gerekiyor.
Paul Isaris

Hiçbir açıklama olmamasına rağmen, benim için hata sadece burada açıklanan komutları çalıştırdıktan sonra çözüldü: npm install -g nave; nave use 6.11.1 +1
Ruben Alves
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.