2016-06-14 48 views
41

Stavo sperimentando sull'uso della versione Node 6.2.1 con un po 'del mio codice. Aveva in programma di migrare la maggior parte dei codici iper-callback orientati verso qualcosa che sembra più pulito e che forse ha prestazioni migliori.SyntaxError: Funzione token imprevisto - Async Await Nodejs

Non ho idea del perché, il terminale genera un errore quando provo ad eseguire il codice del nodo.

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 

Che cosa mi manca? Per favore, gettami un po 'di luce sullo stesso.


Update 1:

Ho cercato di usare Babel come suggerito Quentin, ma, sto ottenendo il seguente errore ancora.

aggiornato Code-

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

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

funzioni 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 ora supporta ufficialmente la funzione asincrona. [vedi questa risposta] (http://stackoverflow.com/a/41757243/4440874). –

+2

@JyotmanSingh Sì. So che ora supporta. Questa domanda mi stava chiedendo circa un anno fa quando dovevamo usare Babele. Grazie per la menzione però. – bozzmob

+3

Ho appena pubblicato qui perché molte persone verranno ancora a questa domanda. Dovrebbero saperlo. –

risposta

51

Async sono not supported by Node versions older than version 7.6.

È necessario trasferire il codice (ad esempio utilizzando Babel) a una versione di JS che il nodo comprende se si sta utilizzando una versione precedente.

+0

Grazie mille! Sì, ero un po 'negligente. Non l'ho controllato! Ma sto ancora avendo problemi. Impossibile eseguire il comando 'babel' per lo stesso problema. Per favore, puoi dare un'occhiata alla domanda aggiornata? – bozzmob

+2

Ciao @bozzmob, ho avuto lo stesso problema di te e ho aggiunto codice di esempio per babel e webpack qui: (http://stackoverflow.com/questions/37815790/syntaxerror-unexpected-token-function-async-await-nodejs/41071244 # 41071244) – stujo

+0

Nel mio caso stavo usando una vecchia versione di nodo. Assicurati di utilizzare l'ultima versione che supporti fuori dalla scatola: ti suggerisco di utilizzare https://github.com/creationix/nvm –

16

Node.JS non supporta completamente ES6 attualmente, in modo da poter utilizzare sia asyncawait modulo o transpile utilizzando Bable.

installare

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

È fondamentale utilizzare la parentesi quando si utilizza la libreria sopra (asyncawait) per attendere e asincrare il polyfill. In ES2017, attendere e asincrono sono parole chiave. Nella biblioteca sopra, sono funzioni. – Phil

14

Se sono solo sperimentando è possibile utilizzare babel-node strumento a riga di comando per provare il nuovo JavaScript caratteristiche

  1. Installare babel-cli nel progetto

    $ npm install --save-dev babel-cli

  2. Installa i preset

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

  3. Setup le preselezioni babel

    Creare .babelrc nella cartella principale del progetto con il seguente contenuto:

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

  4. eseguire lo script con babel-node

    $ babel-node helloz.js

Questo è solo per lo sviluppo e il test, ma sembra essere quello che stai facendo. Alla fine si vorrà impostare webpack (o qualcosa di simile) per transpile tutto il codice per la produzione

Se si desidera eseguire il codice da qualche parte altro, webpack può aiutare e qui è la configurazione più semplice riuscivo a capire:

+0

Il link è morto, potresti aggiornare? – insan3

+0

Link sembra funzionare per me, puoi confermare? – stujo

+0

Clic di nuovo e ho ottenuto lo stesso risultato. Vedo un 404 su github ¿? – insan3

8

node v6.6.0

Se si utilizza solo in fase di sviluppo. È possibile farlo:

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

il package.json sarebbe come questo:

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

creare .babelrc di file e scrivere questo:

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

e poi, esegue il tuo script async/await come questo:

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

+0

thx, usando babel-plugin-transform-async-to-generator risolve il problema quando utilizzo uglify – davey