如何在Firebase Functions中运行Amazon Polly?部署失败求排查
问题排查与修复方案
- 语法错误:polly.js中
accessKeyId字段的字符串未闭合,代码行accessKeyId: "keyId,缺少右侧双引号,直接导致部署时代码解析失败 - 异步逻辑错误:
synthSpeech使用回调式写法,执行时不会返回有效值也不会返回Promise,Firebase可调用云函数要求必须返回Promise或明确的返回值,否则函数逻辑会直接异常 - 云函数参数误用:你使用的是
https.onCall可调用云函数,接收的参数是(data, context),不是HTTP触发函数的(req, res),参数不匹配会导致运行时报错 - 依赖缺失:如果没有在functions目录下安装
aws-sdk依赖,部署时会报模块不存在错误
安全提示:不要把AWS密钥硬编码在代码中,可通过Firebase云函数环境变量存储敏感信息,部署后不会对外暴露。
修正后的index.js
const functions = require("firebase-functions"); const polly = require("./polly"); // onCall的第一个参数是前端传递的data,第二个是请求上下文对象 exports.pollySynth = functions.https.onCall(async (data, context) => { // 等待异步方法执行完成返回结果 return await polly.speak() });
修正后的polly.js
const AWS = require("aws-sdk"); // 修复引号闭合问题,实际使用请替换为你真实的AWS配置 const Polly = new AWS.Polly({ signatureVersion: "v4", region: "my-region", accessKeyId: "keyId", secretAccessKey: "access key", }); const params = { Text: "Hello world. This is the word of speech!", OutputFormat: "json", }; // 将回调方法包装为Promise,适配云函数的异步返回要求 const synthSpeech = function() { return new Promise((resolve, reject) => { Polly.synthesizeSpeech(params, function(err, res) { if (err) { console.log("err", err); reject(err); } else if (res && res.AudioStream instanceof Buffer) { resolve(res.AudioStream); } else { reject(new Error("返回结果不符合预期")) } }); }) }; module.exports = {speak: synthSpeech};
部署前检查步骤
- 进入项目的
functions目录,执行npm install aws-sdk --save安装依赖包 - 确认你填写的AWS region、accessKeyId、secretAccessKey都是有效的正确值
- 执行
firebase deploy --only functions:pollySynth单独部署该函数测试
内容的提问来源于stack exchange,提问作者MAZ
相关产品推荐
相关产品推荐

