2016-06-14 20 views
41

Tôi đã thử nghiệm sử dụng phiên bản Node 6.2.1 với một số mã của tôi. Đã có kế hoạch di chuyển hầu hết các mã định hướng siêu gọi lại đến một cái gì đó trông sạch hơn và có thể hoạt động tốt hơn.Cú phápError: Chức năng mã thông báo không mong đợi - Async Await Nodejs

Tôi không biết tại sao, thiết bị đầu cuối sẽ phát sinh lỗi khi tôi cố thực thi mã nút.

helloz.js

(async function testingAsyncAwait() { 
    await console.log("For Trump's Sake 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 

tôi 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 đề nghị, Nhưng, tôi nhận được lỗi sau vẫn còn.

Cập nhật số-

yêu cầu ("babel-core/đăng ký"); yêu cầu ("babel-polyfill");

(async function testingAsyncAwait() { 
    await console.log("For Trump's Sake Print me!"); 
})(); 

chức năng 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("For Trump's Sake Print me!"); 
    5 | })(); 
+2

Node.js hiện chính thức hỗ trợ chức năng async. [xem câu trả lời này] (http://stackoverflow.com/a/41757243/4440874). –

+2

@JyotmanSingh Có. Tôi biết nó bây giờ hỗ trợ. Câu hỏi này đã được yêu cầu gần một năm trở lại khi chúng tôi đã phải sử dụng babel. Cảm ơn bạn đã đề cập đến mặc dù. – bozzmob

+3

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. –

Trả lời

51

async là not supported by Node versions older than version 7.6.

Bạn cần phải transpile mã của mình (ví dụ: sử dụng Babel) vào 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.

+0

Cảm ơn rất nhiều! Vâng, tôi hơi cẩu thả một chút. Tôi không kiểm tra điều đó! Nhưng, tôi vẫn gặp vấn đề. Không thể chạy lệnh 'babel' cho cùng một vấn đề. Bạn có thể xem câu hỏi được cập nhật không? – bozzmob

+2

Xin chào @bozzmob, tôi đã gặp vấn đề tương tự như bạn và tôi đã thêm mã mẫu cho cả babel và webpack tại đây: (http://stackoverflow.com/questions/37815790/syntaxerror-unexpected-token-function-async-await-nodejs/41071244 # 41071244) – stujo

+0

Trong trường hợp của tôi, tôi đã sử dụng phiên bản nút cũ. Hãy chắc chắn rằng bạn sử dụng cái mới nhất hỗ trợ nó ra khỏi hộp - Tôi khuyên bạn nên sử dụng https://github.com/creationix/nvm –

16

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

cài đặt

npm install --save asyncawait 

helloz.js

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

(async (function testingAsyncAwait() { 
    await (console.log("For Trump's Sake Print me!")); 
}))(); 
+5

Đ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 đang chờ và không đồng bộ. Trong ES2017, đang chờ và không đồng bộ là từ khóa. Trong thư viện ở trên, chúng là các hàm. – Phil

14

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

  1. Install babel-cli vào dự án của bạn

    $ npm install --save-dev babel-cli

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

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

  3. cài đặt cài đặt trước babel bạn

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

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

  4. Chạy kịch bản của bạn với babel-node

    $ babel-node helloz.js

Đây chỉ là để phát triển và thử nghiệm nhưng điều đó 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 một cái gì đó tương tự) để transpile tất cả các mã của bạn cho sản xuất

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

+0

Liên kết đã chết, bạn có thể cập nhật không? – insan3

+0

Liên kết dường như hoạt động với tôi, bạn có thể xác nhận không? – stujo

+0

Clic một lần nữa và tôi đã nhận được kết quả tương tự. Tôi thấy một 404 trên github ¿? – insan3

8

node v6.6.0

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

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

các package.json sẽ 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 .babelrc tập tin và viết những dòng này:

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

và sau đó, chạy kịch bản async/await của bạn như này:

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

+0

thx, sử dụng babel-plugin-transform-async-to-generator giải quyết vấn đề của tôi khi sử dụng uglify – davey

Các vấn đề liên quan