SyntaxError: Funzione token imprevista - Async Await Nodejs


122

Stavo sperimentando l'utilizzo della versione 6.2.1 di Node con parte del mio codice. Aveva intenzione di migrare la maggior parte dei codici orientati all'iper-callback in qualcosa che sembra più pulito e forse funziona meglio.

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

helloz.js

(async function testingAsyncAwait() {
    await console.log("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

Cosa mi manca? Per favore, gettatemi un po 'di luce sullo stesso.


Aggiornamento 1:

Ho provato a usare Babel come suggerito da Quentin, ma ricevo ancora il seguente errore.

Codice aggiornato

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

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

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

2
Node.js ora supporta ufficialmente la funzione asincrona. vedi questa risposta .
Jyotman Singh

2
@JyotmanSingh Sì. So che ora supporta. Questa domanda ci è stata posta quasi un anno fa, quando abbiamo dovuto usare Babel. Grazie per la menzione però.
bozzmob

4
Ho appena postato qui perché molte persone verranno ancora a questa domanda. Dovrebbero saperlo.
Jyotman Singh

Risposte:




28

Node.JS non supporta completamente ES6 attualmente, in modo da poter usare 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("Print me!"));
}))();

8
È fondamentale utilizzare le parentesi quando si utilizza la libreria sopra (asyncawait) per polyfill await e async. In ES2017, wait e async sono parole chiave. Nella libreria sopra, sono funzioni.
Phil

19

Se stai solo sperimentando, puoi utilizzare lo babel-nodestrumento della riga di comando per provare le nuove funzionalità JavaScript

  1. Installa babel-clinel tuo progetto

    $ npm install --save-dev babel-cli

  2. Installa i preset

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

  3. Imposta i tuoi preset Babel

    Crea .babelrcnella cartella principale del progetto con i seguenti contenuti:

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

  4. Esegui il tuo 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 ti consigliamo di configurare webpack (o qualcosa di simile) per trasferire tutto il tuo codice per la produzione

Se vuoi eseguire il codice da qualche altra parte, webpack può aiutarti ed ecco la configurazione più semplice che ho potuto elaborare:


Clicca di nuovo e ho ottenuto lo stesso risultato. Vedo un 404 su GitHub ¿?
Oscar Nevarez

Avevo bisogno di usare ./node_modules/.bin/babel-node helloz.js invece di babel-node helloz.js
Marty

Ciao Marty, penso che dipenda dal fatto che babel-node sia installato globalmente o solo all'interno del progetto del pacchetto, nel mio caso probabilmente l'ho installato a livello globale
stujo

12

node v6.6.0

Se usi solo in fase di sviluppo. Puoi farlo:

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

la package.jsonsarebbe come questo:

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

crea il .babelrcfile e scrivi questo:

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

e poi, esegui lo async/awaitscript in questo modo:

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

grazie, l'utilizzo di babel-plugin-transform-async-to-generator risolve il mio problema durante l'utilizzo di uglify
davey

3

Anche se arrivo in ritardo, quello che ha funzionato per me è stato installare transform-async-generator e transform-runtime plugin in questo modo:

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

la package.jsonsarebbe come questo:

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

crea il .babelrcfile e scrivi questo:

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

e poi felice codifica con async/await


1
se stai usando il codice di Visual Studio per angular, non devi fare alcun lavoro dopo aver usato l'installazione di npm dall'alto. Tutto verrà installato e configurato automaticamente, ma grazie comunque!
Catene del

1

includi e specifica la versione del motore del nodo all'ultima, diciamo che in questo momento ho aggiunto la versione 8.

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

nel seguente file

package.json


0

Anch'io ho avuto lo stesso problema.

Stavo eseguendo il nodo v 6.2 insieme a purgecss nel mio gulpfile. Il problema si è verificato solo quando ho creato un nuovo progetto Laravel; fino a quel momento, non ho mai avuto problemi con purgecss.

Seguendo la dichiarazione di @ Quentin - come le versioni del nodo precedenti alla 7.6 non supportano le funzioni asincrone - ho deciso di aggiornare la mia versione del nodo alla 9.11.2

Questo ha funzionato per me:

1-

$ npm install -g n

$ n 9.11.2

2-

eliminare 'node_modules' dalla directory di route

3-

$ npm install

Non sono ancora sicuro di come funzionasse node / purgecss prima dell'aggiornamento .. ma questo ha funzionato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.