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 | })();

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:




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!"));
}))();

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ć:


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

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


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


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ę.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.