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 | })();

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:




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!"));
}))();

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:


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

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


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


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.