You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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!`));
    
    }
};

错误原因分析

  1. Twilio库导入错误:使用const { Twilio } = require('twilio');导入的是Twilio客户端类,而MessagingResponse属于Twilio的twiml模块,并非Twilio类的属性,因此Twilio.twiml为undefined,导致无法读取MessagingResponse。
  2. 异步错误未捕获:handler是异步函数,但未添加try/catch块,当getName函数抛出异常时,Promise拒绝未被处理,触发UnhandledPromiseRejectionWarning,导致Twilio无法收到正确响应。
  3. 修改后的代码存在语法错误: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 20:48:22