Облачные функции для Firebase Async Await style

Похоже, что функции облака не поддерживают нотацию Async-Await. Есть ли способ, которым я мог бы использовать Babel до тех пор, пока они этого не сделают, или рекомендуется использовать promises?

Моя текущая функция, которая находится на Node, выглядит так:

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

Ответ 1

Cloud Functions запускает LTS-версию node.js, которая в настоящее время соответствует документации 6.14.0. Узел 6.x поддерживает EcmaScript 6, который не включает async/await.

Однако вы можете написать свой код на TypeScript и перенести его в ES5/ES6, что эффективно преобразует использование async/await в обещания. Поиск в Интернете предполагает, что, возможно, этот плагин может быть использован, чтобы помочь Babel с подобной транспиляцией.

Стоит отметить, что теперь интерфейс командной строки Firebase позволяет вам инициализировать новый проект Cloud Functions с собственной поддержкой TypeScript, что команда Firebase в настоящее время рекомендует разработчикам.

Если вы не хотите использовать TypeScript, теперь вы можете также выбрать узел 8 (который в настоящее время находится в бета-версии и поддерживает асинхронное/ожидание для простого JavaScript) в качестве цели развертывания. Вы можете следовать документации для редактирования вашего package.json, чтобы указать, что ваши функции должны быть развернуты на узле 8.

Ответ 3

Вместо того, чтобы переносить TypeScript, я перенес свой javascript после того, как последую за этим очень хорошим постом и взгляну на этот репозиторий.

В основном вы можете сделать:

npm install -g @babel/cli @babel/core @babel/preset-env
  • ОБНОВИТЬ:
    У меня проблемы с версией "7.0.0-beta.51" babel. "7.0.0-beta.44" все еще в порядке.
    Переключиться на стабильную версию 6

    Установка npm --save-dev babel-cli babel-preset-env

Создайте файл .babelrc в папке вашего проекта

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

Переместите папку "functions" в папку "firebaseFunctions" и затем запустите

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

Или выполните эту команду для каждого файла, который вы хотите перенести

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

Ответ 4

В вашем файле functions/.eslintrc.json заданном как 'ecmaVersion': 2017 это устранит синтаксическую ошибку eslint

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

В вашем файле functions/package.json установите версию node на 8, добавив ниже

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

это обновит версию облачного узла до 8 по умолчанию версия узла равна 6

Ответ 5

Вышеуказанные решения не спомогли мне одного. Мне пришлось обновить до последних инструментов Firebase:

npm update -g firebase-tools

а затем обновите мой package.json с добавлением:

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

и все работало нормально с async/await.

Кредиты для этого блога https://howtofirebase.com/cloud-functions-migrating-to-node-8-9640731a8acc