如何从Dialogflow Fulfillment调用谷歌地图API?代码问题与Webhook实现咨询
在Dialogflow Webhook中调用谷歌地图Directions API并返回距离结果
我来帮你解决在Dialogflow Fulfillment里调用谷歌地图API并返回指定距离的问题,先分析你现有代码的问题,再给出可运行的修正版本,同时梳理常见排查点。
你的原代码核心问题
你的代码用了request库发起请求,但忽略了Dialogflow Webhook的异步处理要求:Request.get是异步操作,直接return result根本不会把结果返回给Dialogflow——Webhook会在请求完成前就结束,自然拿不到数据。另外还有两个小问题:URL里的&是HTML转义字符,要换成普通的&;API密钥的位置也需要正确填写。
修正后的可运行代码
下面是适配Dialogflow ES云函数(Node.js环境)的完整代码,用async/await处理异步,同时增加了错误检查:
// 推荐用request-promise-native(request库已弃用),先通过npm安装:npm install request-promise-native const request = require('request-promise-native'); const functions = require('firebase-functions'); const { WebhookClient } = require('dialogflow-fulfillment'); // 处理距离查询意图的核心函数 async function handleDistanceQuery(agent) { try { // 替换成你的谷歌地图API密钥 const GOOGLE_MAPS_API_KEY = 'YOUR_ACTUAL_API_KEY'; // 注意:这里用&而非&,origin/destination可以后续改成从用户输入提取,先写死示例 const directionsApiUrl = `https://maps.googleapis.com/maps/api/directions/json?origin=ikoyi&destination=egbeda&key=${GOOGLE_MAPS_API_KEY}`; // 异步等待谷歌地图API响应 const apiResponse = await request(directionsApiUrl); const result = JSON.parse(apiResponse); // 关键:先检查返回数据结构是否合法,避免数组越界报错 if (!result.routes || result.routes.length === 0 || !result.routes[0].legs || result.routes[0].legs.length === 0) { agent.add('抱歉,暂时无法获取这条路线的信息,请确认地点是否正确'); return; } // 提取你需要的距离文本 const targetDistance = result.routes[0].legs[0].steps[0].distance.text; agent.add(`Distance is : ${targetDistance}`); } catch (error) { console.error('调用谷歌地图API时出错:', error); agent.add('抱歉,获取路线信息时出现了问题,请稍后再试'); } } // 注册意图与处理函数的映射 exports.dialogflowFirebaseFulfillment = functions.https.onRequest((req, res) => { const agent = new WebhookClient({ request: req, response: res }); const intentMap = new Map(); // 替换成你Dialogflow里对应的意图名称 intentMap.set('Distance_Query_Intent', handleDistanceQuery); agent.handleRequest(intentMap); });
如果你更倾向于用现代的node-fetch库,请求部分可以改成这样:
const fetch = require('node-fetch'); // 在handleDistanceQuery函数内替换请求代码: const apiResponse = await fetch(directionsApiUrl); const result = await apiResponse.json();
常见问题排查清单
- 异步处理错误:一定要用
async/await或Promise包裹异步请求,否则Dialogflow会提前终止Webhook,拿不到API返回的数据。 - API密钥权限:确保你的谷歌云API密钥已经启用了Directions API,并且没有设置过于严格的IP限制(测试阶段可以暂时放宽,上线后再配置安全规则)。
- URL格式错误:不要用
&,必须用普通的&分隔API参数,否则谷歌API会识别参数失败。 - 数据结构校验:永远不要直接访问
result.routes[0].legs[0].steps[0]——如果用户输入的地点无效、没有路线,这些数组会是空的,直接访问会抛出Cannot read properties of undefined错误,一定要先做存在性检查。 - 依赖库安装:部署前要确保安装了所有依赖,比如
request-promise-native或node-fetch,可以通过npm install [库名]安装。
内容的提问来源于stack exchange,提问作者deepmynded
相关产品推荐
相关产品推荐

