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

如何从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 06:38:34