SyntaxError: Função de token inesperada - Async Await Nodejs

122

Eu estava experimentando usar o Node versão 6.2.1 com parte do meu código. Tinha planos de migrar a maioria dos códigos orientados a hiperlinks para algo que parece mais limpo e talvez tenha um desempenho melhor.

Não tenho idéia do porquê, o terminal lança um erro quando tento executar o código do nó.

helloz.js

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

Histórico-

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

o que estou perdendo? Por favor, jogue-me alguma luz sobre o mesmo.


Atualização 1:

Tentei usar Babel como sugerido por Quentin, mas ainda estou recebendo o seguinte erro.

Código atualizado-

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

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

Histórico-

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
fonte
2
O Node.js agora suporta oficialmente a função assíncrona. veja esta resposta .
JYOTMAN Singh
2
@JyotmanSingh Sim. Eu sei que agora suporta. Esta pergunta estava se aproximando de um ano atrás, quando tivemos que usar o babel. Obrigado pela menção embora.
bozzmob
4
Acabei de postar aqui, porque muitas pessoas ainda vão chegar a esta pergunta. Eles deveriam saber.
Jyotman Singh

Respostas:

166

As funções assíncronas não são suportadas pelas versões do Node anteriores à versão 7.6 .

Você precisará transpilar seu código (por exemplo, usando Babel ) para uma versão do JS que o Node entenda se você estiver usando uma versão mais antiga.

Dito isso, a versão LTS atual (2018) do Node.js é 8.x, portanto, se você estiver usando uma versão anterior, considere fortemente atualizar.

Quentin
fonte
36

O Nodejs suporta async / waitit da versão 7.6.

Publicação de publicação: https://v8project.blogspot.com.br/2016/10/v8-release-55.html

Phillipe Moreira
fonte
Você pode implantar sua função como NodeJS v6 ou v8, certificando-se de implantar como v8 (Beta).
Aaron Halvorsen
28

O Node.js não suporta totalmente ES6 atualmente, então você pode usar asyncawait módulo ou transpile -lo usando Bable.

instalar

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
fonte
8
É vital usar o parêntese ao usar a biblioteca acima (asyncawait) para polyfill aguardar e assíncrono. No ES2017, aguardar e assíncrono são palavras-chave. Na biblioteca acima, são funções.
26416 Phil
19

Se você está apenas experimentando, pode usar a babel-nodeferramenta de linha de comando para experimentar os novos recursos do JavaScript

  1. Instale babel-clino seu projeto

    $ npm install --save-dev babel-cli

  2. Instale as predefinições

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

  3. Configure suas predefinições de babel

    Crie .babelrcna pasta raiz do projeto com o seguinte conteúdo:

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

  4. Execute seu script com babel-node

    $ babel-node helloz.js

Isso é apenas para desenvolvimento e teste, mas isso parece ser o que você está fazendo. No final, você desejará configurar o webpack (ou algo semelhante) para transpilar todo o seu código para produção

Se você deseja executar o código em outro lugar, o webpack pode ajudar e aqui está a configuração mais simples que eu poderia resolver:

stujo
fonte
Clique novamente e eu tenho o mesmo resultado. Eu vejo um 404 no github ¿?
Oscar Nevarez 30/08
Eu precisava usar helloz.js ./node_modules/.bin/babel-node em vez de helloz.js babel de nó
Marty
Oi Marty, eu acho que depende se você tem babel-node instalados globalmente ou apenas dentro do projeto de pacote, no meu caso eu provavelmente tinha instalado globalmente
stujo
12

node v6.6.0

Se você apenas usa no desenvolvimento. Você consegue fazer isso:

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

o package.jsonseria assim:

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

crie um .babelrcarquivo e escreva isto:

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

e, em seguida, execute seu async/awaitscript assim:

./node_modules/.bin/babel-node script.js
slideshowp2
fonte
thx, usando babel-plugin transformar-async-se gerador resolve o meu problema ao usar enfear
Davey
3

Embora eu esteja chegando atrasado, o que funcionou para mim foi instalar o plugin transform-async-generator e transform-runtime da seguinte forma:

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

o package.jsonseria assim:

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

crie um .babelrcarquivo e escreva isto:

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

e então feliz codificação com async/await

Theophilus Omoregbee
fonte
1
se você estiver usando o código do visual studio para angular, não precisará fazer nenhum trabalho depois de usar o npm install a partir de cima. Tudo será instalado e configurado automaticamente, mas, de qualquer forma, obrigado!
chainstair
1

inclua e especifique a versão do mecanismo do nó para a mais recente, digamos que nesse momento eu adicionei a versão 8.

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

no seguinte arquivo

package.json

Joseph Wambura
fonte
0

Eu também tive o mesmo problema.

Eu estava executando o nó v 6.2 juntamente com o purgecss no meu gulpfile. O problema ocorreu apenas quando criei um novo projeto do Laravel; até aquele momento, eu nunca tive um problema com o purgecss.

Seguindo a declaração de @ Quentin - como as versões de nó anteriores à 7.6 não suportam funções assíncronas - decidi atualizar a versão do nó para 9.11.2

Isso funcionou para mim:

1-

$ npm install -g n

$ n 9.11.2

2-

exclua 'node_modules' do diretório de rotas

3-

$ npm install

Ainda não tenho certeza de como o node / purgecss funcionou antes da atualização .. mas isso funcionou.

A.Morris
fonte