SyntaxError: función de token inesperada - Async Await Nodejs

122

Estaba experimentando con la versión 6.2.1 de Node con parte de mi código. Tenía planes de migrar la mayoría de los códigos orientados a la hiper-devolución de llamada a algo que se vea más limpio y quizás funcione mejor.

No tengo ni idea de por qué, el terminal arroja un error cuando intento ejecutar el código del nodo.

helloz.js

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

Registros

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

¿Qué me estoy perdiendo? Por favor, arrojame algo de luz sobre lo mismo.


Actualización 1:

Traté de usar Babel como sugirió Quentin, pero todavía recibo el siguiente error.

Código actualizado

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

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

Registros

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
fuente
2
Node.js ahora admite oficialmente la función asincrónica. vea esta respuesta .
Jyotman Singh
2
@JyotmanSingh Sí. Sé que ahora es compatible. Esta pregunta se hacía hace casi un año cuando tuvimos que usar babel. Sin embargo, gracias por la mención.
bozzmob
4
Acabo de publicar aquí porque muchas personas seguirán respondiendo a esta pregunta. Deberían saberlo.
Jyotman Singh

Respuestas:

166

Las funciones asíncronas no son compatibles con las versiones de Node anteriores a la versión 7.6 .

Deberá transpilar su código (por ejemplo, usando Babel ) a una versión de JS que Node entienda si está usando una versión anterior.

Dicho esto, la versión LTS actual (2018) de Node.js es 8.x, por lo que si está utilizando una versión anterior, debería considerar la actualización.

Quentin
fuente
28

Node.JS no es totalmente compatible ES6 actualmente, por lo que puede utilizar cualquiera asyncawait módulo o transpile usando bable.

Instalar en pc

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
fuente
8
Es vital usar el paréntesis cuando se usa la biblioteca anterior (asyncawait) para polyfill await y async. En ES2017, await y async son palabras clave. En la biblioteca anterior, son funciones.
Phil
19

Si solo está experimentando, puede usar la babel-nodeherramienta de línea de comandos para probar las nuevas funciones de JavaScript

  1. Instalar babel-clien su proyecto

    $ npm install --save-dev babel-cli

  2. Instalar los presets

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

  3. Configura tus presets de babel

    Cree .babelrcen la carpeta raíz del proyecto con el siguiente contenido:

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

  4. Ejecute su script con babel-node

    $ babel-node helloz.js

Esto es solo para desarrollo y pruebas, pero eso parece ser lo que está haciendo. Al final, querrá configurar el paquete web (o algo similar) para transpilar todo su código para la producción

Si desea ejecutar el código en otro lugar, webpack puede ayudar y aquí está la configuración más simple que pude resolver:

stujo
fuente
Haga clic de nuevo y obtuve el mismo resultado. Veo un 404 en github ¿?
Oscar Nevarez
Necesitaba usar ./node_modules/.bin/babel-node helloz.js en lugar de babel-node helloz.js
Marty
Hola Marty, creo que depende de si tiene babel-node instalado globalmente o solo dentro del proyecto del paquete, en mi caso probablemente lo tenía instalado globalmente
stujo
12

node v6.6.0

Si solo usa en desarrollo. Puedes hacerlo:

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

el package.jsonsería así:

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

crear .babelrcarchivo y escribir esto:

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

y luego, ejecute su async/awaitscript así:

./node_modules/.bin/babel-node script.js
diapositivasp2
fuente
gracias, usar babel-plugin-transform-async-to-generator resuelve mi problema al usar uglify
davey
3

Aunque llego tarde, lo que funcionó para mí fue instalar transform-async-generator y el plugin transform-runtime así:

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

el package.jsonsería así:

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

crear .babelrcarchivo y escribir esto:

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

y luego feliz codificación con async/await

Theophilus Omoregbee
fuente
1
Si está usando el código de Visual Studio para angular, no necesita hacer ningún trabajo después de usar npm install desde arriba. Todo se instalará y configurará automáticamente, ¡pero gracias de todos modos!
escalera
1

incluir y especificar la versión del motor de nodo a la última, digamos que en este momento agregué la versión 8.

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

en el siguiente archivo

package.json

Joseph Wambura
fuente
0

Yo también tuve el mismo problema.

Estaba ejecutando el nodo v 6.2 junto con purgecss dentro de mi gulpfile. El problema solo ocurrió cuando creé un nuevo proyecto de Laravel; hasta ese momento, nunca tuve un problema con purgecss.

Siguiendo la declaración de @ Quentin, cómo las versiones de nodo anteriores a 7.6 no admiten funciones asíncronas, decidí actualizar mi versión de nodo a 9.11.2

Esto funcionó para mí:

1-

$ npm install -g n

$ n 9.11.2

2-

eliminar 'node_modules' del directorio de ruta

3-

$ npm install

Todavía no estoy seguro de cómo funcionaba node / purgecss antes de la actualización ... pero esto funcionó.

A. Morris
fuente