使用actions-on-google获取用户位置遇报错:DialogflowApp不是构造函数
解决DialogflowApp不是构造函数的错误
看起来你碰到了actions-on-google库版本兼容的问题——这个TypeError: DialogflowApp is not a constructor错误,本质是因为你用的库版本已经废弃了DialogflowApp这个旧API。下面给你两种针对性的修复方案:
方案一:适配actions-on-google v2.x版本
如果你还在使用actions-on-google包(而非最新的@assistant/conversation),v2.x版本已经把DialogflowApp重命名为Dialogflow,只需要修改导入和初始化代码即可:
'use strict'; const functions = require('firebase-functions'); // 导入Dialogflow类而非旧的DialogflowApp const { Dialogflow } = require('actions-on-google'); exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => { // 用Dialogflow构造函数初始化实例 const app = new Dialogflow({ request, response }); // 示例:添加获取用户位置的意图处理逻辑 function handleGetLocation(app) { // 请求位置权限 app.askForPermissions('获取你的位置信息以便提供服务', ['DEVICE_PRECISE_LOCATION']); } // 绑定意图到处理函数 const actionMap = new Map(); actionMap.set('your-get-location-intent', handleGetLocation); app.handleRequest(actionMap); });
方案二:升级到最新的@assistant/conversation库
如果想使用Google Assistant最新的API,建议迁移到@assistant/conversation包(v3+),步骤如下:
- 安装新依赖:
npm install @assistant/conversation
- 修改你的 fulfillment 代码:
'use strict'; const functions = require('firebase-functions'); const { Conversation, Permission } = require('@assistant/conversation'); // 初始化Conversation实例 const app = new Conversation({ debug: true }); // 绑定获取位置的意图处理逻辑 app.handle('get-user-location', conv => { // 检查是否已获取位置权限 if (conv.user.location) { const { city, coordinates } = conv.user.location; conv.add(`我获取到你的位置是${city},坐标是${coordinates.latitude}, ${coordinates.longitude}`); } else { // 请求用户授权位置 conv.ask(new Permission({ context: '为了给你提供精准的本地化服务', permissions: 'DEVICE_PRECISE_LOCATION' })); } }); // 导出云函数 exports.dialogflowFirebaseFulfillment = functions.https.onRequest(app);
额外注意事项
- 不管用哪种方案,都要在Dialogflow控制台的意图设置中,为对应的意图添加「权限请求」参数,选择「设备的精确位置」或「设备的大致位置」。
- 部署前记得在函数目录下运行
npm install,确保依赖包正确安装。
内容的提问来源于stack exchange,提问作者Roberto Pettinau
相关产品推荐
相关产品推荐

