42 votes

Fonctions Cloud pour le style Async Await de Firebase

Il semble que Cloud Functions ne prenne pas en charge la notation Async-Await. Y a-t-il un moyen d'utiliser Babel jusqu'à ce qu'il le fasse ou est-il recommandé d'utiliser les promesses ?

Ma fonction actuelle qui se trouve sur Node est comme suit :

exports.getToken = async (req, res) => {
  //1. Generate token from Braintree
  const result = await gateway.clientToken.generate();

  //2. Return the client token
  res.json(result.clientToken);
};

46voto

Doug Stevenson Points 6978

Cloud Functions fonctionne avec la version LTS de node.js, qui selon la documentation est 6.14.0 à l'heure actuelle. node 6.x prend en charge EcmaScript 6, qui n'inclut pas async/await .

Cependant, vous pouvez écrire votre code en TypeScript et le faire transpirer vers ES5/ES6, ce qui convertira efficacement l'utilisation d'async/await en promesses. Une recherche sur le web suggère que peut-être ce plugin peut être utilisé pour aider Babel à effectuer un transpilage similaire.

Il convient de noter que le CLI de Firebase vous permet désormais d'initialiser un nouveau projet Cloud Functions avec Prise en charge native de TypeScript C'est ce que l'équipe de Firebase recommande actuellement aux développeurs.

Si vous ne souhaitez pas utiliser TypeScript, vous pouvez désormais choisir node 8 (qui est actuellement en version bêta et prend en charge async/await pour JavaScript) comme cible de déploiement. Vous pouvez suivez la documentation pour éditer votre package.json pour indiquer que vos fonctions doivent être déployées sur le nœud 8.

0 votes

Il est également facile d'utiliser babel pour compiler votre code ES8 en code ES6 qui fonctionne avec Cloud Functions, voir l'exemple ici : codeburst.io/es6-in-cloud-functions-for-firebase-2-415d15205‌​468

0 votes

Merci, cela a résolu mon problème mais, la branche entière est supprimée si tous les enfants sont d'anciennes valeurs >> puis-je garder les branches vides ou non ?

3 votes

Plus 1 pour le paramètre "moteur" : {"node":8}. Une solution si rapide ! J'aurais aimé pouvoir +100.

39voto

l2aelba Points 3156

Vous pouvez maintenant utiliser Node.js version 8 en ajoutant ceci dans votre functions/package.json :

"engines": {
   "node": "8"
}

Exemple : https://github.com/firebase/functions-samples/blob/Node-8/authenticated-json-api/functions/package.json

1 votes

Bizarre. Je n'avais pas à faire ça

2 votes

Vous devez ajouter --runtime nodejs8 à gcloud si vous utilisez gcloud pour déployer, vous n'avez pas à ajouter ceci si vous utilisez les outils firebase pour déployer les fonctions

0 votes

Cela a bien fonctionné et doit peut-être être accepté comme réponse maintenant puisque les fonctions utilisent également le nœud 8 pendant l'exécution.

7voto

rma Points 117

Au lieu de transpiler TypeScript, j'ai transpilé mon javascript en suivant ceci très beau poste et jetez un coup d'œil à ce référentiel

En gros, vous pouvez le faire :

npm install -g @babel/cli @babel/core @babel/preset-env
  • UPDATE :
    J'ai des problèmes avec la version "7.0.0-beta.51" de babel. La version "7.0.0-beta.44" fonctionne toujours.
    Passage à la version stable 6

    npm install --save-dev babel-cli babel-preset-env

Créez le fichier .babelrc dans le dossier de votre projet.

{
  "presets": [
    ["@babel/env", {
      "targets": {
        "node": "6.11.5"
      }
    }]
  ]
}

Déplacez votre dossier "functions" vers le dossier "firebaseFunctions" puis exécutez

babel firebaseFunctions --out-dir functions --copy-files --ignore firebaseFunctions/node_modules

Ou exécutez cette commande pour chaque fichier que vous voulez transpiler

babel originalfile.js --out-file transpiledfile.js

3voto

wizpert Points 850

Les solutions ci-dessus n'ont pas fonctionné pour moi seul. J'ai dû mettre à jour les derniers outils firebase :

npm update -g firebase-tools

et ensuite mettre à jour mon package.json en ajoutant :

 "engines": {"node": "8"}

et tout fonctionnait bien avec async/await.

Crédits pour ce blog https://howtofirebase.com/cloud-functions-migrating-to-node-8-9640731a8acc

0voto

NuOne T Attygalle Points 847

Dans votre functions/.eslintrc.json fichier défini comme 'ecmaVersion': 2017 cela supprimera l'erreur de syntaxe d'eslint

"parserOptions": {
    "ecmaVersion": 2017
 },

Dans votre functions/package.json fichier défini node version à 8 en ajoutant ci-dessous

"engines": {
     "node": "8"
},

ceci mettra à jour la version du nœud de nuage à 8 la version du nœud par défaut est 6

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X