SyntaxError: Fungsi token tak terduga - Async Await Nodejs

122

Saya sedang bereksperimen menggunakan Node versi 6.2.1 dengan beberapa kode saya. Memiliki rencana untuk memigrasi sebagian besar kode berorientasi hyper-callback ke sesuatu yang terlihat lebih bersih dan mungkin berkinerja lebih baik.

Saya tidak tahu mengapa, terminal memunculkan kesalahan ketika saya mencoba menjalankan kode node.

helloz.js

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

Log-

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

Apa yang saya lewatkan? Tolong beri saya penjelasan yang sama.


Pembaruan 1:

Saya mencoba menggunakan Babel seperti yang disarankan Quentin, Tapi, saya masih mendapatkan kesalahan berikut.

Kode yang Diperbarui-

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

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

Log-

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.dll
sumber
2
Node.js sekarang secara resmi mendukung fungsi async. lihat jawaban ini .
Jyotman Singh
2
@YotkYot. Saya tahu sekarang mendukung. Pertanyaan ini diajukan hampir setahun yang lalu ketika kami harus menggunakan babel. Terima kasih telah menyebutkannya.
bozzmob
4
Saya baru saja memposting di sini karena banyak orang masih akan datang ke pertanyaan ini. Mereka seharusnya tahu.
Jyotman Singh

Jawaban:

166

Fungsi asinkron tidak didukung oleh versi Node yang lebih lama dari versi 7.6 .

Anda harus mentranspilasi kode Anda (misalnya menggunakan Babel ) ke versi JS yang dipahami Node jika Anda menggunakan versi yang lebih lama.

Meskipun demikian, Node.js versi LTS (2018) saat ini adalah 8.x, jadi jika Anda menggunakan versi sebelumnya, Anda harus sangat mempertimbangkan untuk meningkatkannya.

Quentin
sumber
28

Node.js tidak sepenuhnya mendukung ES6 saat ini, sehingga Anda bisa menggunakan asyncawait modul atau transpile menggunakan Bable.

Install

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
sumber
8
Sangat penting untuk menggunakan tanda kurung saat menggunakan pustaka di atas (asyncawait) untuk polyfill await dan async. Di ES2017, await dan async adalah kata kunci. Di perpustakaan di atas, mereka adalah fungsi.
Phil
19

Jika Anda hanya bereksperimen, Anda dapat menggunakan babel-nodealat baris perintah untuk mencoba fitur JavaScript baru

  1. Instal babel-clike dalam proyek Anda

    $ npm install --save-dev babel-cli

  2. Pasang preset

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

  3. Siapkan preset babel Anda

    Buat .babelrcdi folder root proyek dengan konten berikut:

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

  4. Jalankan skrip Anda dengan babel-node

    $ babel-node helloz.js

Ini hanya untuk pengembangan dan pengujian tetapi sepertinya itulah yang Anda lakukan. Pada akhirnya Anda ingin menyiapkan webpack (atau yang serupa) untuk mentranspilasi semua kode Anda untuk produksi

Jika Anda ingin menjalankan kode di tempat lain, webpack dapat membantu dan berikut adalah konfigurasi paling sederhana yang dapat saya lakukan:

stujo
sumber
Klik lagi dan saya mendapatkan hasil yang sama. Saya melihat 404 di github ¿?
Oscar Nevarez
Saya perlu menggunakan ./node_modules/.bin/babel-node helloz.js daripada babel-node helloz.js
Marty
Hai Marty, saya pikir itu tergantung pada apakah Anda menginstal babel-node secara global atau hanya di dalam proyek paket, dalam kasus saya, saya mungkin menginstalnya secara global
stujo
12

node v6.6.0

Jika Anda hanya menggunakan dalam pengembangan. Kamu bisa melakukan ini:

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

yang package.jsonakan menjadi seperti ini:

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

buat .babelrcfile dan tulis ini:

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

dan kemudian, jalankan async/awaitskrip Anda seperti ini:

./node_modules/.bin/babel-node script.js
slideshowp2
sumber
thx, menggunakan babel-plugin-transform-async-to-generator memecahkan masalah saya saat menggunakan uglify
davey
3

Meskipun saya datang terlambat, yang berhasil bagi saya adalah menginstal plugin transform-async-generator dan transform-runtime seperti:

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

yang package.jsonakan menjadi seperti ini:

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

buat .babelrcfile dan tulis ini:

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

dan selamat membuat kode dengan async/await

Theophilus Omoregbee
sumber
1
jika Anda menggunakan kode studio visual untuk sudut, Anda tidak perlu melakukan pekerjaan apa pun setelah menggunakan npm install dari atas. Semuanya akan dipasang dan dikonfigurasi secara otomatis, tapi terima kasih!
tangga rantai
1

sertakan dan tentukan versi mesin node ke yang terbaru, katakanlah saat ini saya menambahkan versi 8.

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

di file berikut

package.json

Joseph Wambura
sumber
0

Saya juga punya masalah yang sama.

Saya menjalankan node v 6.2 bersama menggunakan purgecss dalam gulpfile saya. Masalah hanya terjadi ketika saya membuat proyek Laravel baru; Hingga saat itu, saya tidak pernah memiliki masalah dengan purgecss.

Mengikuti pernyataan @ Quentin - bagaimana versi node sebelum 7.6 tidak mendukung fungsi async - Saya memutuskan untuk memperbarui versi node saya ke 9.11.2

Ini berhasil untuk saya:

1-

$ npm install -g n

$ n 9.11.2

2-

hapus 'node_modules' dari direktori rute

3-

$ npm install

Masih tidak yakin bagaimana node / purgecss bekerja sebelum memperbarui .. tapi ini berhasil.

A. Morris
sumber