SyntaxError: Nieoczekiwana funkcja tokena - Async Await Nodejs

122

Eksperymentowałem z użyciem Node w wersji 6.2.1 z częścią mojego kodu. Planował migrację większości kodów zorientowanych na hiper-wywołanie zwrotne do czegoś, co wygląda czyściej i może działa lepiej.

Nie mam pojęcia, dlaczego terminal wyświetla błąd, gdy próbuję wykonać kod węzła.

helloz.js

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

Dzienniki

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

czego mi brakuje? Proszę, rzuć mi trochę światła na to samo.


Aktualizacja 1:

Próbowałem użyć Babel, jak zasugerował Quentin, ale nadal otrzymuję następujący błąd.

Zaktualizowany kod

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

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

Dzienniki

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 | })();
bozzmob
źródło
2
Node.js oficjalnie obsługuje teraz funkcję asynchroniczną. zobacz tę odpowiedź .
Jyotman Singh
2
@JyotmanSingh Yes. Wiem, że teraz obsługuje. To pytanie zadawano prawie rok temu, kiedy musieliśmy używać babel. Dzięki za wzmiankę.
bozzmob
4
Właśnie napisałem tutaj, ponieważ wiele osób nadal będzie odpowiadać na to pytanie. Powinni wiedzieć.
Jyotman Singh

Odpowiedzi:

166

Funkcje asynchroniczne nieobsługiwane przez wersje węzła starsze niż wersja 7.6 .

Będziesz musiał przetransponować swój kod (np. Używając Babel ) do wersji JS, którą Node zrozumie, jeśli używasz starszej wersji.

To powiedziawszy, aktualna (2018) wersja LTS Node.js to 8.x, więc jeśli używasz wcześniejszej wersji, powinieneś bardzo mocno rozważyć aktualizację.

Quentin
źródło
28

Node.js nie obsługuje w pełni ES6 obecnie, więc można użyć asyncawait moduł lub transpile go za pomocą bable.

zainstalować

npm install --save asyncawait

helloz.js

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

(async (function testingAsyncAwait() {
    await (console.log("Print me!"));
}))();
Nivesh
źródło
8
Podczas korzystania z biblioteki powyżej (asyncawait) konieczne jest użycie nawiasów w celu wypełnienia oczek i async. W ES2017 await i async to słowa kluczowe. W powyższej bibliotece są to funkcje.
Phil
19

Jeśli dopiero eksperymentujesz, możesz użyć babel-nodenarzędzia wiersza poleceń, aby wypróbować nowe funkcje JavaScript

  1. Zainstaluj babel-cliw swoim projekcie

    $ npm install --save-dev babel-cli

  2. Zainstaluj ustawienia wstępne

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

  3. Skonfiguruj swoje ustawienia Babel

    Utwórz .babelrcw folderze głównym projektu z następującą zawartością:

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

  4. Uruchom skrypt z babel-node

    $ babel-node helloz.js

To jest przeznaczone tylko do programowania i testowania, ale wydaje się, że to właśnie robisz. W końcu będziesz chciał skonfigurować pakiet internetowy (lub coś podobnego), aby przetransponować cały kod do produkcji

Jeśli chcesz uruchomić kod w innym miejscu, pakiet webpack może pomóc, a oto najprostsza konfiguracja, jaką mogłem wymyślić:

stujo
źródło
Clic ponownie i otrzymałem ten sam wynik. Widzę 404 na github ¿?
Oscar Nevarez
Musiałem użyć ./node_modules/.bin/babel-node helloz.js zamiast helloz.js węzła babel
Marty
Cześć Marty, myślę, że to zależy od tego, czy masz węzeł babel zainstalowany globalnie, czy tylko w projekcie pakietu, w moim przypadku prawdopodobnie zainstalowałem go globalnie
stujo
12

node v6.6.0

Jeśli po prostu używasz w rozwoju. Możesz to zrobić:

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

package.jsonbyłoby tak:

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

utwórz .babelrcplik i napisz to:

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

a następnie uruchom async/awaitskrypt w ten sposób:

./node_modules/.bin/babel-node script.js
pokaz slajdówp2
źródło
thx, użycie babel-plugin-transform-async-to-generator rozwiązuje mój problem podczas używania uglify
davey
3

Chociaż przychodzę późno, to, co zadziałało, to zainstalowanie transform-async-generator i transform-runtime plugin w następujący sposób:

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

package.jsonbyłoby tak:

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

utwórz .babelrcplik i napisz to:

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

a potem szczęśliwego kodowania z async/await

Theophilus Omoregbee
źródło
1
Jeśli używasz Visual Studio Code dla Angular, nie musisz wykonywać żadnej pracy po użyciu instalacji npm z góry. Wszystko zostanie zainstalowane i skonfigurowane automatycznie, ale mimo wszystko dziękuję!
schody łańcuchowe
1

Uwzględnij i określ najnowszą wersję silnika węzła, powiedzmy, że w tym czasie dodałem wersję 8.

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

w poniższym pliku

package.json

Joseph Wambura
źródło
0

Ja też miałem ten sam problem.

Używałem Node v 6.2 razem z purgecss w moim pliku gulpfile. Problem pojawił się tylko podczas tworzenia nowego projektu Laravel; do tego momentu nigdy nie miałem problemu z purgecss.

Zgodnie z oświadczeniem @ Quentin - jak wersje węzłów wcześniejsze niż 7.6 nie obsługują funkcji asynchronicznych - zdecydowałem się zaktualizować moją wersję węzła do 9.11.2

To zadziałało dla mnie:

1-

$ npm install -g n

$ n 9.11.2

2-

usuń „node_modules” z katalogu tras

3-

$ npm install

Nadal nie jestem pewien, jak działał node / purgecss przed aktualizacją… ale to załatwiło sprawę.

A. Morris
źródło