Включение асинхронной функции в облачные функции Firebase (eslint «Ошибка синтаксического анализа: неожиданная функция токена») - PullRequest
0 голосов
/ 12 декабря 2018

Issue

Как добавить вспомогательный метод async в файл Cloud Functions ' index.js ?Функция async требуется для использования await при преобразовании fs.writefile в Promise , как описано в этом сообщении StackOverflow: fs.writeFile в обещании, асинхронно-синхронный материал .Однако lint не одобряет добавление дополнительного метода вне функций exports к файлу index.js .

Ошибка

Строка 84 относится к вспомогательной функции async function writeFile.

Users / adamhurwitz / coinverse / coinverse-cloud-functions / functions / index.js 84: 7 Ошибка синтаксического анализа:Неожиданная функция токена

problem 1 проблема (1 ошибка, 0 предупреждений)

npm ERR!код ELIFECYCLE

npm ERR!errno 1

npm ERR!functions @ lint: eslint .

npm ERR!Статус выхода 1

npm ERR!

npm ERR!Ошибка в скрипте functions @ lint.

npm ERR!Это, вероятно, не проблема с npm.Скорее всего, выше выводится логирование.

npm ERR!Полный журнал этого прогона можно найти в:

npm ERR!/Users/adamhurwitz/.npm/_logs/2018-12-12T01_47_50_684Z-debug.log

Ошибка: ошибка предустановки функций: команда завершилась с ненулевым кодом выхода1

Настройка

index.js

const path = require('path');
const os = require('os');
const fs = require('fs');
const fsPromises = require('fs').promises;
const util = require('util');
const admin = require('firebase-admin');
const functions = require('firebase-functions');
const {Storage} = require('@google-cloud/storage');
const textToSpeech = require('@google-cloud/text-to-speech');

const storage = new Storage({
  projectId: 'project-id',
});
const client = new textToSpeech.TextToSpeechClient();

admin.initializeApp();

exports.getAudiocast = functions.https.onCall((data, context) => {
  const bucket = storage.bucket('gs://[bucket-name].appspot.com');
  var fileName;
  var tempFile;
  var filePath;

  return client.synthesizeSpeech({
    input: {text: data.text },
    voice: {languageCode: 'en-US', ssmlGender: 'NEUTRAL'},
    audioConfig: {audioEncoding: 'MP3'},
  })
  .then(responses => {
    var response = responses[0]; 
    fileName = data.id + '.mp3'
    tempFile = path.join(os.tmpdir(), fileName);  
    return writeFile(tempFile, response.audioContent)
  })
  .catch(err => {
    console.error("Synthesize Speech Error: " + err);
  })
  .then(() => {
     filePath = "filePath/" + fileName;
     return bucket.upload(tempFile, { destination: filePath })
  })
  .catch(err => {
     console.error("Write Temporary Audio File Error: " + err);
  })
  .then(() => {
   return { filePath: filePath }
  })
  .catch(err => {
     console.error('Upload Audio to GCS ERROR: ' + err);
  });
});

Вспомогательный метод:

async function writeFile(tempFile, audioContent) {
    await fs.writeFile(tempFile, audioContent, 'binary');
}

Попытка решения

Включение Node.js 8 как рекомендовано в посте Облачные функции для Firebase Асинхронный стиль ожидания .

  1. Установить версию Node.js "engines": {"node": "8"}

  2. return await fs.writeFile(tempFile, audioContent, 'binary');

Lint не нравится это решение.

Ответы [ 3 ]

0 голосов
/ 12 декабря 2018

Ваш eslint не настроен для понимания синтаксиса ECMAScript 2017.Конфигурационный файл .eslint.json, созданный по умолчанию в интерфейсе командной строки Fireabse, включает следующую конфигурацию:

"parserOptions": {
  // Required for certain syntax usages
  "ecmaVersion": 6
},

Измените его следующим образом, чтобы помочь ему понять async / await:

  "ecmaVersion": 2017
0 голосов
/ 11 июля 2019

изменить ecmaVersion в .eslintrc.json

"parserOptions": {
// Требуется для некоторых случаев использования синтаксиса
"ecmaVersion": 8
}

0 голосов
/ 12 декабря 2018

Node.js 8 - Promisify

Включение Node.js 8 , как рекомендовано в посте Облачные функции для Firebase Async Await style .

  1. Set Node.js версия "engines": {"node": "8"}
  2. Использование promisify

    const writeFile = util.promisify(fs.writeFile);

    return writeFile(tempFile, response.audioContent, 'binary')

Pre Node.js 8 - Преобразование вручную

Это более старый подход к преобразованию обратных вызовов в обещания, описанный в этом ответе относительно более конкретноговопрос о Google Text To Speech ( TTS ).

const writeFilePromise = (file, data, option) => {
   return new Promise((resolve, reject) => {
       fs.writeFile(file, data, option, error => {
          if (error) reject(error);
          resolve("File created! Time for the next step!");
       });
   });
};

return writeFilePromise(tempFile, response.audioContent, 'binary');
...