Dialogflow ES与Voximplant呼叫列表连接失败求助
问题:Dialogflow智能体与Voximplant呼叫列表功能连接失败,提示
number未定义 错误信息
- JS error: number is undefined in /application.js:427:7
场景代码
require(Modules.CallList); require(Modules.AI) let dialogflow, call, hangup var CALLER_ID = "441618022716" let number; let phone_number // Create outbound call as soon as StartScenarios HTTP API arrives VoxEngine.addEventListener(AppEvents.Started, function (e) { let data = VoxEngine.customData(); // <-- data from CSV string in JSON format data = JSON.parse(data); phone_number = data.phone_number; call = VoxEngine.callPSTN(phone_number, CALLER_ID) // replace CALLER_ID with the number we bought in previous step (the real one, test number does not work) call.addEventListener(CallEvents.Connected, onCallConnected) call.addEventListener(CallEvents.Disconnected, VoxEngine.terminate) call.addEventListener(CallEvents.Failed, VoxEngine.terminate) }) function onCallConnected(e) { // Create Dialogflow object dialogflow = AI.createDialogflow({ lang: DialogflowLanguage.ENGLISH_US }) dialogflow.addEventListener(AI.Events.DialogflowResponse, onDialogflowResponse) // Sending WELCOME event to let the agent says a welcome message dialogflow.sendQuery({event : {name: "WELCOME", language_code:"en"}}) // Playback marker used for better user experience dialogflow.addMarker(-300) // Start sending media from Dialogflow to the call dialogflow.sendMediaTo(call) dialogflow.addEventListener(AI.Events.DialogflowPlaybackFinished, (e) => { // Dialogflow TTS playback finished. Hangup the call if hangup flag was set to true if (hangup) call.hangup() }) dialogflow.addEventListener(AI.Events.DialogflowPlaybackStarted, (e) => { // Dialogflow TTS playback started }) dialogflow.addEventListener(AI.Events.DialogflowPlaybackMarkerReached, (e) => { // Playback marker reached - start sending audio from the call to Dialogflow call.sendMediaTo(dialogflow) }) } // Handle Dialogflow responses function onDialogflowResponse(e) { // If DialogflowResponse with queryResult received - the call stops sending media to Dialogflow // in case of response with queryResult but without responseId we can continue sending media to dialogflow if (e.response.queryResult !== undefined && e.response.responseId === undefined) { call.sendMediaTo(dialogflow) } else if (e.response.queryResult !== undefined && e.response.responseId !== undefined) { // Do whatever required with e.response.queryResult or e.response.webhookStatus // If we need to hangup because end of conversation has been reached if (e.response.queryResult.diagnosticInfo !== undefined && e.response.queryResult.diagnosticInfo.end_conversation == true) { hangup = true } // Telephony messages arrive in fulfillmentMessages array if (e.response.queryResult.fulfillmentMessages != undefined) { e.response.queryResult.fulfillmentMessages.forEach((msg) => { if (msg.platform !== undefined && msg.platform === "TELEPHONY") processTelephonyMessage(msg) }) } } } // Process telephony messages from Dialogflow function processTelephonyMessage(msg) { // Transfer call to msg.telephonyTransferCall.phoneNumber if (msg.telephonyTransferCall !== undefined) { /** * Example: * dialogflow.stop() * let newcall = VoxEngine.callPSTN(msg.telephonyTransferCall.phoneNumber, "put verified CALLER_ID here") * VoxEngine.easyProcess(call, newcall) */ } // Synthesize speech from msg.telephonySynthesizeSpeech.text if (msg.telephonySynthesizeSpeech !== undefined) { // See the list of available TTS languages at https://voximplant.com/docs/references/voxengine/language // Example: // if (msg.telephonySynthesizeSpeech.ssml !== undefined) call.say(msg.telephonySynthesizeSpeech.ssml, {"language": VoiceList.Amazon.en_US_Joanna}) // else call.say(msg.telephonySynthesizeSpeech.text, {"language": VoiceList.Amazon.en_US_Joanna}) } // Play audio file located at msg.telephonyPlayAudio.audioUri if (msg.telephonyPlayAudio !== undefined) { // audioUri contains Google Storage URI (gs://), we need to transform it to URL (https://) let url = msg.telephonyPlayAudio.audioUri.replace("gs://", "https://storage.googleapis.com/") // Example: call.startPlayback(url) } }
问题分析与解决方案
核心问题
错误提示number is undefined,结合代码来看,你声明了变量let number;但从未给它赋值,而Voximplant的CallList模块可能期望这个变量存在并包含要拨打的号码。同时,你当前使用phone_number变量存储号码,但CallList模块并未识别这个变量名。
解决方案1:统一变量名为number
修改代码,将所有phone_number替换为number:
// 移除let phone_number,保留number let number; // 在Started事件中赋值 number = data.phone_number; // 调用callPSTN时使用number call = VoxEngine.callPSTN(number, CALLER_ID)
解决方案2:检查CSV数据格式
确保CallList使用的CSV文件中包含名为phone_number的列,且在导入时正确映射为JSON的phone_number字段。如果CSV列名不同(比如number),则需要调整代码中的data.phone_number为对应的键名。
解决方案3:添加错误处理
在解析自定义数据时增加校验,避免因数据缺失导致错误:
VoxEngine.addEventListener(AppEvents.Started, function (e) { let data = VoxEngine.customData(); try { data = JSON.parse(data); } catch (err) { console.error("自定义数据JSON格式错误:", err); VoxEngine.terminate(); return; } // 校验号码是否存在 if (!data.phone_number) { console.error("自定义数据中缺少phone_number字段"); VoxEngine.terminate(); return; } number = data.phone_number; call = VoxEngine.callPSTN(number, CALLER_ID); // 后续事件监听代码... })
内容的提问来源于stack exchange,提问作者Peter Bonnebaigt
相关产品推荐
相关产品推荐

