使用Node.js开发Twilio无服务器WhatsApp服务时遇82002回调错误
问题:Twilio无服务器WhatsApp服务出现82002回调错误
错误详情
- Twilio返回错误码:82002(Function响应错误,状态码5xx)
- 原始报错:
UnhandledPromiseRejectionWarning: Unhandled promise rejection: TypeError: Cannot read property 'MessagingResponse' of undefined - 错误触发位置:handler函数中创建
MessagingResponse实例的代码行
当前问题代码
const { GoogleSpreadsheet} = require('google-spreadsheet'); let fs = require('fs'); const { Twilio } = require('twilio'); const { error } = require('console'); const Response = require('twilio/lib/http/response'); let credsFile = Runtime.getAssets()['/creds.json'].path; let creds = JSON.parse(fs.readFileSync(credsFile, 'utf-8')); async function getName(name) { const doc = new GoogleSpreadsheet('where I enter the Google Sheet ID'); await doc.useServiceAccountAuth(creds); await doc.loadInfo(); const krishnaNamesSheet = doc.sheetsByIndex[0]; const krishaNames = await krishnaNamesSheet.getRows(); const krishna = krishaNames.find(row => row.Name.toLowerCase() === name.toLowerCase()); return krishna; } exports.handler = async function(context, event, callback) { const twiml = new Twilio.twiml.MessagingResponse(); const name = event.Body.trim(); console.log(name); const krishna = await getName(name); if(krishna) { twiml.message(`The meaning of the Krishna name ${event.Body} is: ${krishna.Meaning}`); } else { twiml.message(`I'm sorry, I don't know about that name yet!`); } callback(null, twiml); };
尝试过的无效修改
if(krishna) { return callback(null, twiml.message(`The meaning of the Krishna name ${event.Body} is: ${krishna.Meaning}`)); } else { return callback(new Error(return twiml.message(`I'm sorry, I don't know about that name yet!`)); } };
错误原因分析
- Twilio库导入错误:使用
const { Twilio } = require('twilio');导入的是Twilio客户端类,而MessagingResponse属于Twilio的twiml模块,并非Twilio类的属性,因此Twilio.twiml为undefined,导致无法读取MessagingResponse。 - 异步错误未捕获:handler是异步函数,但未添加try/catch块,当
getName函数抛出异常时,Promise拒绝未被处理,触发UnhandledPromiseRejectionWarning,导致Twilio无法收到正确响应。 - 修改后的代码存在语法错误:
return callback(new Error(return twiml.message(...)));中嵌套return属于语法错误,且错误回调应传递Error对象,而非Twiml消息。
修复方案及代码
步骤1:修正Twilio模块导入
直接从twiml模块解构导入MessagingResponse:
const { MessagingResponse } = require('twilio').twiml;
步骤2:添加异步错误捕获
在async handler中用try/catch包裹所有异步操作,确保异常被捕获并通过callback返回。
步骤3:保留正确的Twiml构建逻辑
仅在业务逻辑分支构建Twiml消息,异常时直接传递Error对象给callback。
修复后的完整代码:
const { GoogleSpreadsheet} = require('google-spreadsheet'); const fs = require('fs'); const { MessagingResponse } = require('twilio').twiml; let credsFile = Runtime.getAssets()['/creds.json'].path; let creds = JSON.parse(fs.readFileSync(credsFile, 'utf-8')); async function getName(name) { const doc = new GoogleSpreadsheet('替换为你的Google Sheet ID'); await doc.useServiceAccountAuth(creds); await doc.loadInfo(); const krishnaNamesSheet = doc.sheetsByIndex[0]; const krishaNames = await krishnaNamesSheet.getRows(); return krishaNames.find(row => row.Name.toLowerCase() === name.toLowerCase()); } exports.handler = async function(context, event, callback) { try { const twiml = new MessagingResponse(); const name = event.Body.trim(); console.log(name); const krishna = await getName(name); if(krishna) { twiml.message(`The meaning of the Krishna name ${event.Body} is: ${krishna.Meaning}`); } else { twiml.message(`I'm sorry, I don't know about that name yet!`); } callback(null, twiml); } catch (err) { console.error(err); callback(err); } };
内容的提问来源于stack exchange,提问作者Sid
相关产品推荐
相关产品推荐

