SyntaxError: Beklenmeyen belirteç işlevi - Async Await Nodejs


122

Kodumun bir kısmıyla Node 6.2.1 sürümünü kullanmayı deniyordum . Hiper geri arama odaklı kodların çoğunu daha temiz görünen ve belki daha iyi performans gösteren bir şeye geçirme planları vardı.

Neden olduğuna dair hiçbir fikrim yok, düğüm kodunu çalıştırmaya çalıştığımda terminal bir hata veriyor.

helloz.js

(async function testingAsyncAwait() {
    await console.log("Print me!");
})();

Kütükler-

BOZZMOB-M-T0HZ:rest bozzmob$ node helloz.js 
/Users/bozzmob/Documents/work/nextgennms/rest/helloz.js:1
(function (exports, require, module, __filename, __dirname) { (async function testingAsyncAwait() {
                                                                     ^^^^^^^^
SyntaxError: Unexpected token function
    at Object.exports.runInThisContext (vm.js:53:16)
    at Module._compile (module.js:513:28)
    at Object.Module._extensions..js (module.js:550:10)
    at Module.load (module.js:458:32)
    at tryModuleLoad (module.js:417:12)
    at Function.Module._load (module.js:409:3)
    at Function.Module.runMain (module.js:575:10)
    at startup (node.js:160:18)
    at node.js:456:3
BOZZMOB-M-T0HZ:rest bozzmob$ node -v
v6.2.1

Neyi kaçırıyorum? Lütfen bana da biraz ışık at.


Güncelleme 1:

Quentin'in önerdiği gibi Babel'i kullanmaya çalıştım ama yine de aşağıdaki hatayı alıyorum.

Güncellenen Kod

require("babel-core/register");
require("babel-polyfill");

    (async function testingAsyncAwait() {
        await console.log("Print me!");
    })();

Kütükler-

BOZZMOB-M-T0HZ:rest bozzmob$ babel helloz.js > helloz.trans.js
SyntaxError: helloz.js: Unexpected token (3:7)
  1 | require("babel-polyfill");
  2 | 
> 3 | (async function testingAsyncAwait() {
    |        ^
  4 |     await console.log("Print me!");
  5 | })();

2
Node.js artık resmi olarak eşzamansız işlevi desteklemektedir. bu yanıtı görün .
Jyotman Singh

2
@JyotmanSingh Evet. Artık desteklediğini biliyorum. Bu soru, babel kullanmak zorunda olduğumuz bir yıla yakın bir süre önce soruyordu. Yine de bahsettiğiniz için teşekkürler.
bozzmob

4
Buraya yazdım çünkü birçok kişi hala bu soruya gelecek. Bilmeliler.
Jyotman Singh

Yanıtlar:




28

Node.JS şu anda ES6'yı tam olarak desteklemiyor, bu nedenle asyncawait modülünü kullanabilir veya Bable kullanarak onu aktarabilirsiniz.

Yüklemek

npm install --save asyncawait

helloz.js

var async = require('asyncawait/async');
var await = require('asyncawait/await');

(async (function testingAsyncAwait() {
    await (console.log("Print me!"));
}))();

8
Bekleme ve eşzamansız çoklu doldurma için yukarıdaki kitaplığı (asyncawait) kullanırken parantez kullanmak çok önemlidir. ES2017'de, await ve async anahtar sözcüklerdir. Yukarıdaki kütüphanede bunlar işlevlerdir.
Phil

19

Sadece deneme yapıyorsanız babel-node, yeni JavaScript özelliklerini denemek için komut satırı aracını kullanabilirsiniz.

  1. babel-cliProjenize yükleyin

    $ npm install --save-dev babel-cli

  2. Ön ayarları yükleyin

    $ npm install --save-dev babel-preset-es2015 babel-preset-es2017

  3. Babel ön ayarlarınızı kurun

    .babelrcAşağıdaki içeriklerle proje kök klasöründe oluşturun :

    { "presets": ["es2015","es2017"] }

  4. Komut dosyanızı ile çalıştırın babel-node

    $ babel-node helloz.js

Bu sadece geliştirme ve test için ama yaptığınız şey bu gibi görünüyor. Sonunda, üretim için tüm kodunuzu dönüştürmek için web paketi (veya benzer bir şey) kurmak isteyeceksiniz.

Kodu başka bir yerde çalıştırmak istiyorsanız, webpack yardımcı olabilir ve işte yapabileceğim en basit yapılandırma:


Tekrar tıklayın ve aynı sonucu aldım. Github'da bir 404 görüyorum ¿?
Oscar Nevarez

Babel-node helloz.js yerine ./node_modules/.bin/babel-node helloz.js kullanmam gerekiyordu
Marty

Merhaba Marty, sanırım bu, babel-
node'un

12

node v6.6.0

Sadece geliştirmede kullanırsanız. Bunu yapabilirsiniz:

npm i babel-cli babel-plugin-transform-async-to-generator babel-polyfill --save-dev

şu şekilde package.jsonolurdu:

"devDependencies": {
   "babel-cli": "^6.18.0",
   "babel-plugin-transform-async-to-generator": "^6.16.0",
   "babel-polyfill": "^6.20.0"
}

.babelrcdosya oluşturun ve şunu yazın:

{
  "plugins": ["transform-async-to-generator"]
}

ve sonra async/awaitkomut dosyanızı şu şekilde çalıştırın :

./node_modules/.bin/babel-node script.js

çirkinleştirmek kullanırken thx kullanarak babil-eklentisi-transform-asenk jeneratöre sorunumu çözer
Davey

3

Geç gelmeme rağmen, benim için işe yarayan şey, transform-async-generator ve transform-runtime eklentisini şu şekilde kurmaktı:

npm i babel-plugin-transform-async-to-generator babel-plugin-transform-runtime --save-dev

şu şekilde package.jsonolurdu:

"devDependencies": {
   "babel-plugin-transform-async-to-generator": "6.24.1",
   "babel-plugin-transform-runtime": "6.23.0"
}

.babelrcdosya oluşturun ve şunu yazın:

{
  "plugins": ["transform-async-to-generator", 
["transform-runtime", {
      "polyfill": false,
      "regenerator": true
    }]
]
}

ve sonra mutlu kodlama async/await


1
Eğer açısal için görsel stüdyo kodu kullanıyorsanız, yukarıdan npm kurulumunu kullandıktan sonra herhangi bir iş yapmanıza gerek yoktur. Her şey otomatik olarak yüklenecek ve yapılandırılacak, ancak yine de teşekkürler!
chainstair

1

düğüm motoru sürümünü en son sürümüne dahil edin ve belirtin, şu anda sürüm 8'i ekledim diyelim.

{
  "name": "functions",
  "dependencies": {
    "firebase-admin": "~7.3.0",
    "firebase-functions": "^2.2.1",
  },
  "engines": {
    "node": "8"
  },
  "private": true
}

aşağıdaki dosyada

package.json


0

Ben de aynı sorunu yaşadım.

Ben gulp dosyamda purgecss kullanmanın yanı sıra node v 6.2 çalıştırıyordum. Sorun yalnızca yeni bir Laravel projesi oluşturduğumda ortaya çıktı; o noktaya kadar, purgecss ile hiç sorun yaşamadım.

@ Quentin'in ifadesinin ardından - 7.6'dan önceki düğüm sürümleri eşzamansız işlevleri nasıl desteklemez? Düğüm sürümümü 9.11.2'ye güncellemeye karar verdim

Bu benim için çalıştı:

1-

$ npm install -g n

$ n 9.11.2

2-

yol dizininden 'node_modules'i sil

3-

$ npm install

Hala güncellemeden önce node / purgecss'in nasıl çalıştığından emin değilim .. ama bu hile yaptı.

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.