Функции Firebase не могут развертываться: SyntaxError: Неожиданная функция токена
Я пытаюсь развернуть функцию в firebase, и во время развертывания я получаю сообщение об ошибке
Ошибка: функции развернуты неправильно.
Может ли это быть связано с асинхронной функцией?
Фактическое поведение
Функции развертываются с ошибками. Кли показывает следующее сообщение:
================ журнал консоли ================
> eslint .
✔ functions: Finished running predeploy script.
i functions: ensuring necessary APIs are enabled...
✔ functions: all necessary APIs are enabled
i functions: preparing functions directory for uploading...
i functions: packaged functions (56.39 KB) for uploading
✔ functions: functions folder uploaded successfully
i functions: updating function sendContactEmailOAuth...
⚠ functions[sendContactEmailOAuth]: Deployment error.
Function load error: Code in file index.js can't be loaded.
Is there a syntax error in your code?
Detailed stack trace: /user_code/index.js:13
async function getJwt() {
^^^^^^^^
================ файл функций index.js ================
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();
const { JWT } = require('google-auth-library/build/src/index');
exports.sendContactEmailOAuth = functions.https.onRequest((req, res) => {
const sender_msg = 'just a test'
const email = '[email protected]'
async function getJwt() {
const client = new JWT(
functions.config().service_key.client_email,
null,
functions.config().service_key.private_key,
['https://www.googleapis.com/auth/cloud-platform', 'https://mail.google.com'],
);
await client.authorize();
const url = 'https://www.googleapis.com/dns/v1/projects/${functions.config().service_key.project_id}';
const res = await client.request({ url });
console.log(res.data);
}
getJwt();
/* send email with nodemailer to be inserted here */
});
================ файл package.json ================
{
"name": "functions",
"description": "Cloud Functions for Firebase",
"scripts": {
"lint": "eslint .",
"serve": "firebase serve --only functions",
"shell": "firebase functions:shell",
"start": "npm run shell",
"deploy": "firebase deploy --only functions",
"logs": "firebase functions:log"
},
"dependencies": {
"firebase-admin": "~5.12.0",
"firebase-functions": "^1.0.2",
"firebase-tools": "^3.18.4",
"google-auth-library": "^1.4.0",
"nodemailer": "^4.6.4"
},
"devDependencies": {
"eslint": "^4.12.0",
"eslint-plugin-promise": "^3.6.0"
},
"private": true
}
Ответы
Ответ 1
По состоянию на сентябрь 2019 года:
- Обновите firebase-admin:
npm install --save firebase-admin
- Обновите firebase-функции:
npm install --save firebase-functions
- Добавьте
"engines": { "node": "10" }
в ваш /functions/package.json
...
"dependencies": {
"firebase-admin": "^8.5.0",
"firebase-functions": "^3.2.0"
},
"devDependencies": {
"tslint": "~5.19.0",
"typescript": "~3.6.2"
},
"engines": {
"node": "10"
}
...
По состоянию на август 2018 года:
Облачные функции теперь поддерживают Node 8 (8.11.1). Посмотрите этот блог.
Обновление до узла 8
Как указано в этом сообщении в блоге, выполните следующие действия для обновления до Узла 8:
- Обновите вашу версию Firebase-функций через
npm install --save [email protected]
- Обновите firebase-tools с помощью
npm update -g firebase-tools
- Добавьте
"engines": { "node": "8" }
к вашему /functions/package.json
Ответ 2
В настоящее время функции облака выполняют узел 6.11.5. Узел 6 поддерживает ECMAScript 2015. Вы используете async/await, который впервые доступен в ECMAScript 2017, который сначала поддерживается узлом 8.
Если вы хотите использовать синтаксис async/wait с облачными функциями сегодня, перед его развертыванием вам придется перевести свой код на ES6. По-моему, лучше использовать TypeScript, который добавляет гораздо больше хороших вещей для обычного JavaScript. CLI Firebase поддерживает TS, встроенные в него, поэтому я бы попробовал.