SyntaxError: Unerwartete Token-Funktion - Async Await Nodejs

122

Ich habe versucht , Node Version 6.2.1 mit einem Teil meines Codes zu verwenden. Hatte Pläne, die meisten Hyper-Callback-orientierten Codes auf etwas zu migrieren, das sauberer aussieht und möglicherweise eine bessere Leistung erbringt.

Ich habe keine Ahnung warum, das Terminal gibt einen Fehler aus, wenn ich versuche, den Knotencode auszuführen.

helloz.js

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

Protokolle -

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

Was vermisse ich? Bitte werfen Sie mir etwas Licht auf das gleiche.


Update 1:

Ich habe versucht, Babel zu verwenden, wie Quentin vorgeschlagen hat. Es wird jedoch immer noch der folgende Fehler angezeigt.

Aktualisierter Code-

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

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

Protokolle -

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
quelle
2
Node.js unterstützt jetzt offiziell die asynchrone Funktion. siehe diese Antwort .
Jyotman Singh
2
@JyotmanSingh Ja. Ich weiß, dass es jetzt unterstützt. Diese Frage wurde vor fast einem Jahr gestellt, als wir Babel verwenden mussten. Vielen Dank für die Erwähnung.
Bozzmob
4
Ich habe gerade hier gepostet, weil noch viele Leute auf diese Frage kommen werden. Sie sollten es wissen.
Jyotman Singh

Antworten:

166

Async-Funktionen werden von Node-Versionen, die älter als Version 7.6 sind, nicht unterstützt .

Sie müssen Ihren Code (z. B. mit Babel ) auf eine Version von JS übertragen, die Node versteht, wenn Sie eine ältere Version verwenden.

Die aktuelle (2018) LTS- Version von Node.js ist jedoch 8.x. Wenn Sie also eine frühere Version verwenden, sollten Sie ein Upgrade in Betracht ziehen.

QUentin
quelle
36

Nodejs unterstützt async / await ab Version 7.6.

Beitrag veröffentlichen: https://v8project.blogspot.com.br/2016/10/v8-release-55.html

Phillipe Moreira
quelle
Sie können Ihre Funktion als NodeJS v6 oder v8 bereitstellen. Stellen Sie sicher, dass Sie als v8 (Beta) bereitgestellt werden.
Aaron Halvorsen
28

Node.JS nicht vollständig ES6 unterstützt derzeit, so dass Sie entweder verwenden können asyncawait Modul oder transpile es Bable verwenden.

Installieren

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
quelle
8
Es ist wichtig, die Klammer zu verwenden, wenn Sie die obige Bibliothek (asyncawait) verwenden, um das Warten und Asynchronisieren zu beenden. In ES2017 sind Warten und Asynchronisieren Schlüsselwörter. In der obigen Bibliothek sind sie Funktionen.
Phil
19

Wenn Sie nur experimentieren, können Sie babel-nodedie neuen JavaScript-Funktionen mit dem Befehlszeilentool ausprobieren

  1. Installieren Sie babel-cliin Ihrem Projekt

    $ npm install --save-dev babel-cli

  2. Installieren Sie die Voreinstellungen

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

  3. Richten Sie Ihre Babel-Voreinstellungen ein

    Erstellen Sie .babelrcim Projektstammordner den folgenden Inhalt:

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

  4. Führen Sie Ihr Skript mit aus babel-node

    $ babel-node helloz.js

Dies ist nur für die Entwicklung und das Testen gedacht, aber genau das scheinen Sie zu tun. Am Ende möchten Sie ein Webpack (oder ähnliches) einrichten, um Ihren gesamten Code für die Produktion zu transpilieren

Wenn Sie den Code woanders ausführen möchten, kann Webpack helfen. Hier ist die einfachste Konfiguration, die ich ausarbeiten könnte:

stujo
quelle
Wieder Clic und ich habe das gleiche Ergebnis erzielt. Ich sehe einen 404 auf Github?
Oscar Nevarez
Ich musste ./node_modules/.bin/babel-node helloz.js anstelle von babel-node helloz.js verwenden
Marty
Hallo Marty, ich denke, das hängt davon ab, ob Sie babel-node global oder nur innerhalb des
Paketprojekts
12

node v6.6.0

Wenn Sie nur in der Entwicklung verwenden. Du kannst das:

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

das package.jsonwäre so:

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

.babelrcDatei erstellen und schreiben:

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

Führen Sie dann Ihr async/awaitSkript folgendermaßen aus:

./node_modules/.bin/babel-node script.js
Diashowp2
quelle
thx, mit babel-plugin-transform-async-to-generator löst mein problem bei der
verwendung
3

Obwohl ich zu spät komme, funktionierte es für mich, den Transform-Async-Generator und das Transform-Runtime- Plugin wie folgt zu installieren :

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

das package.jsonwäre so:

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

.babelrcDatei erstellen und schreiben:

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

und dann gerne mit codieren async/await

Theophilus Omoregbee
quelle
1
Wenn Sie Visual Studio-Code für Angular verwenden, müssen Sie nach der Verwendung von npm install von oben keine Arbeit mehr ausführen. Alles wird automatisch installiert und konfiguriert, aber trotzdem danke!
Kettentreppe
1

Fügen Sie die neueste Version der Node Engine hinzu und geben Sie sie an. Sagen wir zu diesem Zeitpunkt, ich habe Version 8 hinzugefügt.

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

in der folgenden Datei

package.json

Joseph Wambura
quelle
0

Ich hatte auch das gleiche Problem.

Ich habe Node v 6.2 neben purgecss in meinem gulpfile ausgeführt. Das Problem trat nur auf, als ich ein neues Laravel-Projekt erstellte. Bis zu diesem Zeitpunkt hatte ich nie ein Problem mit der Reinigung.

Nach der Aussage von @ Quentin, dass Knotenversionen vor 7.6 keine asynchronen Funktionen unterstützen, habe ich beschlossen, meine Knotenversion auf 9.11.2 zu aktualisieren

Das hat bei mir funktioniert:

1-

$ npm install -g n

$ n 9.11.2

2-

Löschen Sie 'node_modules' aus dem Routenverzeichnis

3-

$ npm install

Ich bin mir immer noch nicht sicher, wie Node / Purgecss vor dem Update funktioniert hat. Aber das hat den Trick gemacht.

A. Morris
quelle