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

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.



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

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:


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

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


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


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.