Jovo Framework 1.0.0在AWS Lambda上isNewUser()始终为false及NEW_USER不触发问题
解决Jovo Framework 1.0.0在AWS Lambda上
isNewUser()始终返回false的问题 嘿,我之前用Jovo 1.x版本的时候也碰到过一模一样的问题,折腾了好一阵才搞明白根因,给你梳理清楚:
核心原因:Lambda的无状态存储特性
Jovo 1.0.0在本地运行时,默认用FileDb存储用户数据——它会把用户信息存在项目的db文件夹里,所以能持久化跟踪用户是否是新用户。但部署到AWS Lambda后,默认存储变成了MemoryDb:这是一种临时内存存储,Lambda的执行环境是无状态的,每次函数调用结束后内存里的所有数据都会被清除,下次请求进来时又是全新的环境。
这直接导致两个问题:
isNewUser()的判断依赖存储中的用户历史记录,可MemoryDb每次都是空的,Jovo会自动创建新用户对象,但这个版本的Jovo在这种场景下会错误返回false,而非预期的true。NEW_USER处理函数触发的前提是识别用户首次访问,没有持久化存储的话,Jovo根本没法记住用户是否来过,自然永远不会触发。
解决办法:配置持久化存储(DynamoDB)
要彻底解决这个问题,得给Lambda上的Jovo技能配置持久化存储,最常用的就是AWS DynamoDB,步骤如下:
- 安装DynamoDB插件
在项目根目录运行命令:
npm install jovo-db-dynamodb --save
- 在app.js中配置DynamoDB
修改你的app.js,添加DynamoDB配置:
const { DynamoDb } = require('jovo-db-dynamodb'); // 初始化Jovo app后,添加这部分配置 app.use( new DynamoDb({ tableName: 'JovoUserStorage', // 自定义你的表名 region: 'us-east-1' // 替换成你的AWS区域,比如eu-west-1 // 本地测试需配置AWS凭证,Lambda上运行可省略(靠IAM角色授权) // accessKeyId: 'YOUR_AWS_ACCESS_KEY', // secretAccessKey: 'YOUR_AWS_SECRET_KEY', }) );
给Lambda配置IAM权限
确保你的Lambda执行角色有访问DynamoDB的权限,至少要允许dynamodb:GetItem、dynamodb:PutItem、dynamodb:UpdateItem这几个操作,你可以在AWS IAM控制台给角色添加对应策略。调用save()持久化数据
修改用户数据后,一定要调用this.save()确保数据写入DynamoDB:
'LAUNCH': function() { if(this.user().isNewUser()) { this.tell('Welcome new user! This will work now on Lambda.'); this.save(); // 保存用户状态 } else { this.tell('Welcome back!'); } }
临时替代方案(不推荐长期使用)
如果你暂时不想配置DynamoDB,可以手动通过自定义属性判断新用户:
'LAUNCH': function() { // 检查自定义的首次访问标记 if (!this.user().data.hasVisited) { this.user().data.hasVisited = true; this.tell('Hello new user!'); this.save(); } else { this.tell('Welcome back!'); } }
不过这个方案本质还是需要持久化存储,不然Lambda调用还是会丢失数据,所以优先推荐DynamoDB方案。
另外提一句,Jovo 1.x版本已经停止维护很久了,有机会的话建议升级到最新版本,既能避免这类老版本bug,还能获得更多新功能和稳定性。
内容的提问来源于stack exchange,提问作者Florian Kalisch
相关产品推荐
相关产品推荐

