web-dev-qa-db-ja.com

Firebase Cloud関数内に非同期関数を含める(eslint「解析エラー:予期しないトークン関数」)

問題

asyncヘルパーメソッドをCloud Functions 'index.jsファイルに追加するにはどうすればよいですか?説明されているように、_fs.writefile_をPromiseに変換するときに、asyncを使用するには、await関数が必要です。このStackOverflowの投稿: fs.writeFile in the promise、非同期同期のもの 。ただし、lintは、exports関数の外部のメソッドをindex.jsに追加することを承認しません。ファイル。

エラー

84は、ヘルパー関数_async function writeFile_を参照しています。

Users/adamhurwitz/coinverse/coinverse-cloud-functions/Functions/index.js 84:7エラー解析エラー:予期しないトークン関数

✖1つの問題(1つのエラー、0の警告)

npm ERR!コードELIFECYCLE

npm ERR! errno 1

npm ERR!関数@lint:_eslint ._

npm ERR!終了ステータス1

npm ERR!

npm ERR!関数@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.js8を有効にする Firebase Async Awaitスタイルのクラウド関数

  1. Node.jsバージョンを設定 _"engines": {"node": "8"}_

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

Lintはこのソリューションが好きではありません。

5
Adam Hurwitz

Node.js8-約束する

投稿で推奨されているようにNode.js8を有効にする Firebase Async Awaitスタイルのクラウド関数

  1. Node.jsバージョンを設定 _"engines": {"node": "8"}_
  2. promisifyを使用します

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

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

Node.js8以前-手動変換

これは、コールバックを約束に変換するための古いアプローチです。これは、Googleテキスト読み上げに関するより具体的な質問に関する answer[〜#〜] 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');
_
1
Adam Hurwitz

.eslintrc.jsonのecmaVersionを変更します

"parserOptions":{
//特定の構文の使用に必要
"ecmaVersion":8
}

1
Shyam