SyntaxError: ฟังก์ชันโทเค็นที่ไม่คาดคิด - Async Await Nodejs


122

ฉันกำลังทดลองใช้ Node เวอร์ชัน6.2.1กับโค้ดบางส่วนของฉัน มีแผนที่จะย้ายรหัสที่เน้นการโทรกลับแบบไฮเปอร์ส่วนใหญ่ไปยังสิ่งที่ดูสะอาดกว่าและอาจทำงานได้ดีกว่า

ฉันไม่รู้ว่าทำไมเทอร์มินัลแสดงข้อผิดพลาดเมื่อฉันพยายามรันโค้ดโหนด

helloz.js

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

Logs-

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

ฉันขาดอะไรไป? โปรดให้ความสว่างแก่ฉันในสิ่งเดียวกัน


อัปเดต 1:

ฉันพยายามใช้ Babel ตามที่ Quentin แนะนำ แต่ฉันยังคงพบข้อผิดพลาดต่อไปนี้

อัปเดตรหัส -

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

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

Logs-

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 รองรับฟังก์ชัน async อย่างเป็นทางการแล้ว ดูคำตอบนี้
Jyotman Singh

2
@JyotmanSingh ใช่ค่ะ ฉันรู้ว่าตอนนี้รองรับแล้ว คำถามนี้ถูกถามเมื่อเกือบหนึ่งปีก่อนที่เราต้องใช้ Babel ขอบคุณสำหรับการกล่าวถึง
bozzmob

4
ฉันเพิ่งโพสต์ที่นี่เพราะหลายคนยังคงมาถึงคำถามนี้ พวกเขาควรรู้
Jyotman Singh

คำตอบ:


166

ฟังก์ชั่น Async จะไม่ได้รับการสนับสนุนจาก Node รุ่นเก่ากว่ารุ่น 7.6

คุณจะต้องโอนรหัสของคุณ (เช่นการใช้Babel ) เป็นเวอร์ชันของ JS ที่ Node เข้าใจหากคุณใช้เวอร์ชันเก่ากว่า

ที่กล่าวว่าNode.js เวอร์ชันปัจจุบัน (2018) LTSคือ 8.x ดังนั้นหากคุณใช้เวอร์ชันก่อนหน้านี้คุณควรพิจารณาอัปเกรดเป็นอย่างยิ่ง



28

Node.js ไม่สนับสนุน ES6 ขณะนี้เพื่อให้คุณสามารถใช้asyncawaitโมดูลหรือtranspileโดยใช้ bable

ติดตั้ง

npm install --save asyncawait

helloz.js

var async = require('asyncawait/async');
var await = require('asyncawait/await');

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

9
จำเป็นอย่างยิ่งที่จะต้องใช้วงเล็บเมื่อใช้ไลบรารีด้านบน (asyncawait) เพื่อรอและไม่ซิงค์โพลีฟิลล์ ใน ES2017 รอและ async คือคีย์เวิร์ด ในไลบรารีด้านบนเป็นฟังก์ชัน
ฟิล

19

หากคุณเพิ่งทดลองใช้คุณสามารถใช้babel-nodeเครื่องมือบรรทัดคำสั่งเพื่อทดลองใช้คุณลักษณะใหม่ของ JavaScript

  1. ติดตั้งbabel-cliในโครงการของคุณ

    $ npm install --save-dev babel-cli

  2. ติดตั้งค่าที่ตั้งล่วงหน้า

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

  3. ตั้งค่าที่ตั้งไว้ล่วงหน้า Babel ของคุณ

    สร้าง.babelrcในโฟลเดอร์รูทของโปรเจ็กต์ที่มีเนื้อหาต่อไปนี้:

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

  4. เรียกใช้สคริปต์ของคุณด้วย babel-node

    $ babel-node helloz.js

นี่เป็นเพียงการพัฒนาและการทดสอบ แต่ดูเหมือนว่าคุณกำลังทำอยู่ ท้ายที่สุดคุณจะต้องตั้งค่า webpack (หรือสิ่งที่คล้ายกัน) เพื่อถ่ายทอดโค้ดทั้งหมดของคุณสำหรับการผลิต

หากคุณต้องการเรียกใช้รหัสที่อื่น webpack สามารถช่วยได้และนี่คือการกำหนดค่าที่ง่ายที่สุดที่ฉันสามารถทำได้:


คลิอีกครั้งและฉันก็ได้ผลลัพธ์เดียวกัน ฉันเห็น 404 บน github ¿?
Oscar Nevarez

ฉันจำเป็นต้องใช้. /node_modules/.bin/babel-node helloz.js แทน babel-node helloz.js
Marty

สวัสดี Marty ฉันคิดว่านั่นขึ้นอยู่กับว่าคุณติดตั้ง babel-node ทั่วโลกหรือภายในโครงการแพ็คเกจในกรณีของฉันฉันอาจติดตั้งทั่วโลก
stujo

12

node v6.6.0

หากคุณใช้ในการพัฒนา คุณสามารถทำได้:

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

package.jsonจะเป็นเช่นนี้

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

สร้าง.babelrcไฟล์และเขียนสิ่งนี้:

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

จากนั้นเรียกใช้async/awaitสคริปต์ของคุณดังนี้:

./node_modules/.bin/babel-node script.js

ขอบคุณการใช้ babel-plugin-transform-async-to-generator ช่วยแก้ปัญหาของฉันเมื่อใช้
uglify

3

แม้ว่าฉันจะมาช้า แต่สิ่งที่ได้ผลสำหรับฉันคือการติดตั้งtransform-async-generatorและปลั๊กอินtransform-runtimeดังนี้:

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

package.jsonจะเป็นเช่นนี้

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

สร้าง.babelrcไฟล์และเขียนสิ่งนี้:

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

แล้วมีความสุขกับการเขียนโค้ดด้วย async/await


1
หากคุณใช้รหัส Visual Studio สำหรับเชิงมุมคุณไม่จำเป็นต้องทำงานใด ๆ หลังจากใช้การติดตั้ง npm จากด้านบน ทุกอย่างจะได้รับการติดตั้งและกำหนดค่าโดยอัตโนมัติ แต่ยังไงก็ตามขอบคุณ!
chainstair

1

รวมและระบุเวอร์ชันเอ็นจิ้นของโหนดเป็นเวอร์ชันล่าสุดกล่าวว่าในเวลานี้ฉันได้เพิ่มเวอร์ชัน 8 แล้ว

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

ในไฟล์ต่อไปนี้

package.json


0

ฉันก็มีปัญหาเดียวกันเช่นกัน

ฉันใช้งานโหนด v 6.2 ควบคู่ไปกับการใช้ purgecss ภายใน gulpfile ของฉัน ปัญหาเกิดขึ้นเมื่อฉันสร้างโปรเจ็กต์ Laravel ใหม่เท่านั้น จนถึงจุดนั้นฉันไม่เคยมีปัญหากับ purgecss

ตามคำสั่งของ @ Quentin - วิธีที่โหนดเวอร์ชันก่อน 7.6 ไม่รองรับฟังก์ชัน async - ฉันตัดสินใจอัปเดตเวอร์ชันโหนดเป็น 9.11.2

สิ่งนี้ใช้ได้ผลสำหรับฉัน:

1-

$ npm install -g n

$ n 9.11.2

2-

ลบ 'node_modules' จากไดเรกทอรีเส้นทาง

3-

$ npm install

ยังไม่แน่ใจว่า node / purgecss ทำงานอย่างไรก่อนที่จะอัปเดต .. แต่นี่เป็นเคล็ดลับ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.