2016-06-14 39 views
41

Eksperymentowałem na używaniu wersji węzła 6.2.1 z niektórymi z mojego kodu. Miałem plany migracji większości kodów zorientowanych na hiperłącze do czegoś, co wygląda na czystsze i może lepiej działa.Błąd składni: nieoczekiwana funkcja znacznika - Async Await Nodejs

Nie mam pojęcia dlaczego, terminal zgłasza błąd podczas próby wykonania kodu węzła.

helloz.js

(async function testingAsyncAwait() { 
    await console.log("For Trump's Sake Print me!"); 
})(); 

Logs-

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 sugeruje Quentin, Ale jestem coraz następujący błąd nadal.

Aktualizacja Code

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

(async function testingAsyncAwait() { 
    await console.log("For Trump's Sake Print me!"); 
})(); 

funkcje Logs-

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("For Trump's Sake Print me!"); 
    5 | })(); 
+2

node.js teraz oficjalnie obsługuje funkcję transmisji asynchronicznej. [patrz ta odpowiedź] (http://stackoverflow.com/a/41757243/4440874). –

+2

@JyotmanSingh Tak. Wiem, że teraz obsługuje. To pytanie wymagało blisko roku, kiedy musieliśmy używać babel. Dzięki za wzmiankę. – bozzmob

+3

Właśnie napisałem tutaj, ponieważ wielu ludzi nadal będzie przychodzić na to pytanie. Powinni wiedzieć. –

Odpowiedz

51

asynchroniczne są not supported by Node versions older than version 7.6.

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

+0

Wielkie dzięki! Tak, trochę zaniedbałem. Nie sprawdziłem tego! Ale nadal mam problemy. Nie można uruchomić polecenia 'babel' dla tego samego problemu. Czy możesz przejrzeć zaktualizowane pytanie? – bozzmob

+2

Witam @bozzmob, miałem ten sam problem co ty i ja dodaliśmy przykładowy kod zarówno dla babel, jak i dla webpacka tutaj: (http://stackoverflow.com/questions/37815790/syntaxerror-unexpected-token-function-async-await-nodejs/41071244 # 41071244) – stujo

+0

W moim przypadku użyłem starej wersji węzła. Upewnij się, że korzystasz z najnowszego, który obsługuje go po wyjęciu z pudełka - Proponuję użyć https://github.com/creationix/nvm –

16

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("For Trump's Sake Print me!")); 
}))(); 
+5

Konieczne jest użycie nawiasu przy korzystaniu z powyższej biblioteki (asyncawait) do polyfill na czas oczekiwania i asynchronizacji. W ES2017 oczekują i asynchronizują słowa kluczowe. W powyższej bibliotece są to funkcje. – Phil

14

Jeśli tylko eksperymentowanie można użyć babel-node narzędzia wiersza polecenia, aby wypróbować nową JavaScript wyposażony

  1. Install babel-cli do projektu

    $ npm install --save-dev babel-cli

  2. Zainstaluj ustawienia wstępne

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

  3. Konfiguracja Twoich ustawień babel

    Załóż .babelrc w folderze głównym projektu z następujących treści:

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

  4. uruchomić skrypt z babel-node

    $ babel-node helloz.js

Jest to przeznaczone wyłącznie do programowania i testowania, ale wydaje się, że to właśnie robisz. W końcu będziesz chciał założyć WebPACK (lub coś podobnego) do transpile cały swój kod do produkcji

Jeśli chcesz uruchomić gdzieś kod indziej, WebPack mogą pomóc i tu jest najprostsza konfiguracja mogłem wypracować:

+0

Link nie działa, czy możesz go zaktualizować? – insan3

+0

Link wydaje się działać dla mnie, czy możesz potwierdzić? – stujo

+0

Clic ponownie i mam ten sam wynik. Widzę 404 na github ¿? – insan3

8

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

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

package.json byłoby tak:

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

tworzyć .babelrc plik i napisać to:

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

a następnie uruchomić Twój skrypt: async/await TO:

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

+0

thx, używając babel-plugin-transform-async-do-generatora rozwiązuje mój problem przy użyciu uglify – davey