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

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:




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

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:


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

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


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


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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.