Облачные функции для 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.
Ответ 2
Теперь вы можете использовать Node.js версии 8, добавив это в ваши functions/package.json
:
"engines": {
"node": "8"
}
Пример: https://github.com/firebase/functions-samples/blob/Node-8/authenticated-json-api/functions/package.json
Ответ 3
Вместо того, чтобы переносить TypeScript, я перенес свой javascript после того, как последую за этим очень хорошим постом и взгляну на этот репозиторий.
В основном вы можете сделать:
npm install -g @babel/cli @babel/core @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