SyntaxError: Chức năng mã thông báo không mong muốn - Async Await Nodejs


122

Tôi đang thử nghiệm sử dụng Node phiên bản 6.2.1 với một số mã của mình. Đã có kế hoạch di chuyển hầu hết các mã định hướng siêu gọi lại sang thứ gì đó trông sạch hơn và có thể hoạt động tốt hơn.

Tôi không biết lý do tại sao, thiết bị đầu cuối báo lỗi khi tôi cố gắng thực thi mã nút.

helloz.js

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

Nhật ký-

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

Tôi đang thiếu gì? Xin vui lòng ném cho tôi một số ánh sáng trên cùng.


Cập nhật 1:

Tôi đã cố gắng sử dụng Babel như Quentin đề xuất, Nhưng tôi vẫn gặp lỗi sau.

Đã cập nhật mã-

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

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

Nhật ký-

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 hiện đã chính thức hỗ trợ chức năng không đồng bộ. xem câu trả lời này .
Jyotman Singh

2
@JyotmanSingh Có. Tôi biết nó bây giờ hỗ trợ. Câu hỏi này đã được đặt ra vào gần một năm trước khi chúng tôi phải sử dụng babel. Cảm ơn vì đã đề cập đến.
bozzmob 24/02/17

4
Tôi chỉ đăng ở đây vì nhiều người vẫn sẽ đến câu hỏi này. Họ nên biết.
Jyotman Singh

Câu trả lời:


166

Các chức năng không đồng bộ không được hỗ trợ bởi các phiên bản Node cũ hơn phiên bản 7.6 .

Bạn sẽ cần chuyển mã của mình (ví dụ: sử dụng Babel ) sang phiên bản JS mà Node hiểu được nếu bạn đang sử dụng phiên bản cũ hơn.

Điều đó nói rằng, phiên bản LTS (2018) hiện tại của Node.js là 8.x, vì vậy nếu bạn đang sử dụng phiên bản cũ hơn, bạn rất nên cân nhắc nâng cấp.



28

Node.js không hỗ trợ đầy đủ ES6 hiện, vì vậy bạn có thể sử dụng asyncawait mô-đun hoặc transpile nó sử dụng Bable.

Tải về

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
Điều quan trọng là sử dụng dấu ngoặc đơn khi sử dụng thư viện ở trên (asyncawait) để polyfill await và async. Trong ES2017, await và async là các từ khóa. Trong thư viện trên, chúng là các hàm.
Phil

19

Nếu bạn chỉ đang thử nghiệm, bạn có thể sử dụng babel-nodecông cụ dòng lệnh để thử các tính năng JavaScript mới

  1. Cài đặt babel-clivào dự án của bạn

    $ npm install --save-dev babel-cli

  2. Cài đặt các cài đặt trước

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

  3. Thiết lập cài đặt trước cho babel của bạn

    Tạo .babelrctrong thư mục gốc của dự án với nội dung sau:

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

  4. Chạy tập lệnh của bạn với babel-node

    $ babel-node helloz.js

Điều này chỉ để phát triển và thử nghiệm nhưng đó dường như là những gì bạn đang làm. Cuối cùng, bạn sẽ muốn thiết lập webpack (hoặc thứ gì đó tương tự) để chuyển tải tất cả mã của bạn cho quá trình sản xuất

Nếu bạn muốn chạy mã ở một nơi khác, webpack có thể trợ giúp và đây là cấu hình đơn giản nhất mà tôi có thể tìm ra:


Nhấp một lần nữa và tôi nhận được kết quả tương tự. Tôi thấy số 404 trên github ¿?
Oscar Nevarez,

Tôi cần sử dụng ./node_modules/.bin/babel-node helloz.js thay vì babel-node helloz.js
Marty

Xin chào Marty, tôi nghĩ điều đó phụ thuộc vào việc bạn đã cài đặt nút babel trên toàn cầu hay chỉ trong gói dự án, trong trường hợp của tôi, tôi có thể đã cài đặt nó trên toàn cầu
stujo

12

node v6.6.0

Nếu bạn chỉ sử dụng trong phát triển. Bạn có thể làm được việc này:

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

những package.jsonsẽ là như thế này:

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

tạo .babelrctệp và viết cái này:

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

và sau đó, chạy async/awaittập lệnh của bạn như sau:

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

thx, sử dụng babel-plugin-transform-async-to-máy phát điện giải quyết vấn đề của tôi khi sử dụng làm xấu đi
Davey

3

Mặc dù tôi đang đi làm muộn, những gì làm việc cho tôi là để cài đặt chuyển đổi-async-máy phát điệnchuyển đổi-runtime plugin như vậy:

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

những package.jsonsẽ là như thế này:

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

tạo .babelrctệp và viết cái này:

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

và sau đó viết mã vui vẻ với async/await


1
nếu bạn sử dụng mã visual studio cho góc, bạn không cần thực hiện bất kỳ công việc nào sau khi sử dụng cài đặt npm từ bên trên. Mọi thứ sẽ được cài đặt và cấu hình tự động, nhưng dù sao cũng cảm ơn bạn!
chainstair

1

bao gồm và chỉ định phiên bản công cụ nút mới nhất, giả sử tại thời điểm này tôi đã thêm phiên bản 8.

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

trong tập tin sau

package.json


0

Tôi cũng có cùng một vấn đề.

Tôi đang chạy nút phiên bản 6.2 cùng với việc sử dụng purgecss trong gulpfile của mình. Sự cố chỉ xảy ra khi tôi tạo một dự án Laravel mới; cho đến thời điểm đó, tôi chưa bao giờ gặp vấn đề với purgecss.

Theo tuyên bố của @ Quentin - cách các phiên bản nút trước 7.6 không hỗ trợ các chức năng không đồng bộ - tôi quyết định cập nhật phiên bản nút của mình lên 9.11.2

Điều này đã làm việc cho tôi:

1-

$ npm install -g n

$ n 9.11.2

2-

xóa 'node_modules' khỏi thư mục tuyến đường

3-

$ npm install

Vẫn không chắc node / purgecss hoạt động như thế nào trước khi cập nhật .. nhưng điều này đã thành công.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.