SyntaxError: fonction de jeton inattendue - Async Await Nodejs

122

J'essayais d'utiliser la version 6.2.1 de Node avec une partie de mon code. Avait prévu de migrer la plupart des codes orientés hyper-rappel vers quelque chose qui semble plus propre et peut-être plus performant.

Je n'ai aucune idée de pourquoi, le terminal génère une erreur lorsque j'essaye d'exécuter le code du nœud.

helloz.js

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

Journaux-

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'est-ce que je rate? Veuillez me jeter un peu de lumière sur la même chose.


Mise à jour 1:

J'ai essayé d'utiliser Babel comme l'a suggéré Quentin, mais j'obtiens toujours l'erreur suivante.

Code mis à jour

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

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

Journaux-

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
la source
2
Node.js prend désormais officiellement en charge la fonction asynchrone. voir cette réponse .
Jyotman Singh
2
@JyotmanSingh Oui. Je sais qu'il prend désormais en charge. Cette question se posait il y a près d'un an lorsque nous devions utiliser Babel. Merci pour la mention cependant.
bozzmob
4
Je viens de poster ici parce que beaucoup de gens viendront encore à cette question. Ils devraient savoir.
Jyotman Singh

Réponses:

36

Nodejs prend en charge async / await à partir de la version 7.6.

Publication de publication: https://v8project.blogspot.com.br/2016/10/v8-release-55.html

Phillipe Moreira
la source
Vous pouvez déployer votre fonction en tant que NodeJS v6 ou v8, assurez-vous de déployer en tant que v8 (bêta).
Aaron Halvorsen
28

Node.JS ne prend pas entièrement en charge ES6 actuellement, vous pouvez donc soit utiliser le module asyncawait, soit le transpiler à l'aide de Bable.

installer

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
la source
8
Il est essentiel d'utiliser la parenthèse lors de l'utilisation de la bibliothèque ci-dessus (asyncawait) pour polyfill await et async. Dans ES2017, await et async sont des mots clés. Dans la bibliothèque ci-dessus, ce sont des fonctions.
Phil
19

Si vous faites juste des expériences, vous pouvez utiliser l' babel-nodeoutil de ligne de commande pour essayer les nouvelles fonctionnalités JavaScript

  1. Installez babel-clidans votre projet

    $ npm install --save-dev babel-cli

  2. Installez les préréglages

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

  3. Configurez vos préréglages Babel

    Créez .babelrcdans le dossier racine du projet avec le contenu suivant:

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

  4. Exécutez votre script avec babel-node

    $ babel-node helloz.js

C'est uniquement pour le développement et les tests, mais cela semble être ce que vous faites. En fin de compte, vous voudrez configurer Webpack (ou quelque chose de similaire) pour transpiler tout votre code pour la production

Si vous souhaitez exécuter le code ailleurs, webpack peut vous aider et voici la configuration la plus simple que je pourrais élaborer:

stujo
la source
Cliquez à nouveau et j'ai obtenu le même résultat. Je vois un 404 sur github ¿?
Oscar Nevarez
J'avais besoin d'utiliser ./node_modules/.bin/babel-node helloz.js au lieu de babel-node helloz.js
Marty
Salut Marty, je pense que cela dépend si vous avez installé babel-node globalement ou simplement dans le projet de package, dans mon cas, je l'ai probablement installé dans le monde entier
stujo
12

node v6.6.0

Si vous utilisez simplement en développement. Tu peux le faire:

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

le package.jsonserait comme ceci:

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

créez un .babelrcfichier et écrivez ceci:

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

puis, exécutez votre async/awaitscript comme ceci:

./node_modules/.bin/babel-node script.js
diaporamap2
la source
thx, en utilisant babel-plugin-à-transformer-async-générateur résout mon problème lors de l' utilisation enlaidir
Davey
3

Bien que j'arrive en retard, ce qui a fonctionné pour moi était d'installer le plugin transform-async-generator et transform-runtime comme ceci:

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

le package.jsonserait comme ceci:

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

créez un .babelrcfichier et écrivez ceci:

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

puis bon codage avec async/await

Theophilus Omoregbee
la source
1
si vous utilisez le code de Visual Studio pour Angular, vous n'avez pas besoin de faire de travail après avoir utilisé npm install ci-dessus. Tout sera installé et configuré automatiquement, mais merci quand même!
chainstair
1

inclure et spécifier la version la plus récente du moteur de nœud, disons qu'à ce moment-là, j'ai ajouté la version 8.

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

dans le fichier suivant

package.json

Joseph Wambura
la source
0

J'ai aussi eu le même problème.

J'utilisais node v 6.2 en plus d'utiliser purgecss dans mon gulpfile. Le problème est survenu uniquement lorsque j'ai créé un nouveau projet Laravel; jusque-là, je n'ai jamais eu de problème avec purgecss.

Suite à la déclaration de @ Quentin - comment les versions de nœud antérieures à 7.6 ne prennent pas en charge les fonctions asynchrones - j'ai décidé de mettre à jour ma version de nœud vers la 9.11.2

Cela a fonctionné pour moi:

1-

$ npm install -g n

$ n 9.11.2

2-

supprimer 'node_modules' du répertoire de route

3-

$ npm install

Je ne sais toujours pas comment le nœud / purgecss fonctionnait avant la mise à jour ... mais cela a fait l'affaire.

A.Morris
la source