SyntaxError : 예기치 않은 토큰 함수-Async Await Nodejs


122

내 코드 중 일부와 함께 Node 버전 6.2.1 을 사용하는 실험을했습니다 . 대부분의 하이퍼 콜백 지향 코드를 더 깔끔하고 성능이 더 좋은 코드로 마이그레이션 할 계획이었습니다.

이유는 모르겠지만 노드 코드를 실행하려고하면 터미널에서 오류가 발생합니다.

helloz.js

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

로그

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 :

Quentin이 제안한대로 Babel을 사용하려고했지만 여전히 다음과 같은 오류가 발생합니다.

업데이트 된 코드

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

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

로그

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는 이제 공식적으로 비동기 기능을 지원합니다. 이 답변을 참조하십시오 .
Jyotman 싱

2
@JyotmanSingh 네. 나는 그것이 지금 지원한다는 것을 안다. 이 질문은 우리가 바벨을 사용해야했던 거의 1 년 전부터 묻고있었습니다. 그래도 언급 해 주셔서 감사합니다.
bozzmob

4
많은 사람들이 여전히이 질문에 올 것이기 때문에 방금 여기에 게시했습니다. 그들은 알아야합니다.
Jyotman Singh

답변:




28

Node.JS는 현재 ES6을 완전히 지원하지 않으므로 asyncawait 모듈을 사용 하거나 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!"));
}))();

8
await 및 async를 폴리 필하기 위해 위의 라이브러리 (asyncawait)를 사용할 때 괄호를 사용하는 것이 중요합니다. ES2017에서 await와 async는 키워드입니다. 위의 라이브러리에서 그것들은 함수입니다.
Phil

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. 바벨 사전 설정 설정

    .babelrc다음 내용으로 프로젝트 루트 폴더에 만듭니다 .

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

  4. 다음으로 스크립트 실행 babel-node

    $ babel-node helloz.js

이것은 개발과 테스트를위한 것이지만 당신이하는 일인 것 같습니다. 결국 모든 코드를 프로덕션 용으로 트랜스 파일하기 위해 웹팩 (또는 이와 유사한 것)을 설정하고 싶을 것입니다.

다른 곳에서 코드를 실행하려면 webpack이 도움이 될 수 있으며 여기에 제가 해결할 수있는 가장 간단한 구성이 있습니다.


다시 클릭하고 같은 결과를 얻었습니다. github ¿에 404가 표시됩니까?
Oscar Nevarez

babel-node helloz.js 대신 ./node_modules/.bin/babel-node helloz.js를 사용해야했습니다
Marty

안녕 Marty, 그것은 당신이 바벨 노드를 전역 적으로 설치했는지 아니면 패키지 프로젝트 내에 설치했는지에 달려 있다고 생각합니다. 제 경우에는 아마도 전 세계적으로 설치했을 것입니다
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

thx, babel-plugin-transform-async-to-generator를 사용하면 uglify를 사용할 때 내 문제가 해결됩니다
davey

3

늦게 왔지만 저에게 효과가 있었던 것은 transform-async-generatortransform-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

나도 같은 문제가 있었다.

내 gulpfile 내에서 purgecss를 사용하여 노드 v 6.2를 실행했습니다. 새 Laravel 프로젝트를 만들 때만 문제가 발생했습니다. 그 시점까지 나는 purgecss에 문제가 없었습니다.

@Quentin의 진술에 따라-7.6 이전의 노드 버전이 비동기 기능을 지원하지 않는 방법-노드 버전을 9.11.2로 업데이트하기로 결정했습니다.

이것은 나를 위해 일했습니다.

1-

$ npm install -g n

$ n 9.11.2

2-

경로 디렉토리에서 'node_modules'삭제

삼-

$ npm install

업데이트하기 전에 node / purgecss가 어떻게 작동하는지 아직 확실하지 않지만 이것은 트릭입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.