Amazon Lex V2通过Node.js访问MongoDB的实现方案咨询
问题背景
已基于Amazon Lex V2完成聊天机器人搭建,参考AWS官方LexRuntimeV2接口文档使用Node.js实现了与Amazon Lex的交互逻辑,当前基础功能运行正常。现有业务需求为:用户向机器人提出特定问题时,需要访问MongoDB数据库返回对应结果。已知可通过Lambda函数实现该类需求,但Amazon Lex V2版本对应的相关实现资料较少,需要确认该场景下通过Node.js访问MongoDB的可行方案。
当前已实现的Lex交互代码如下:
var params = { botAliasId: 'XXXXXX', /* required */ botId: 'XXXXXXXXX', /* required */ localeId: 'en_US', /* required */ requestContentType: 'text/plain; charset=utf-8', /* required */ sessionId: req.body.sessionId.toString(), /* required */ inputStream: req.body.message, responseContentType: "audio/mpeg", }; lexruntimev2.recognizeUtterance(params, (err, data) => { if (err) console.log(err, err.stack); // 异常场景打印错误 else {console.log(data)} // 正常场景打印返回结果 });
可行实现方案
完全可以通过Node.js实现Lex V2对接MongoDB的需求,不需要修改你现有客户端调用recognizeUtterance的代码,核心是用Lex的Fulfillment Lambda承载查库逻辑,具体落地步骤如下:
- 第一步:Lex侧配置
把需要触发查库的特定问题配置为独立意图,在意图的Fulfillment选项里开启「使用Lambda函数实现」,绑定你自己写的Node.js Lambda函数即可。用户提问匹配到这个意图时,Lex会自动把用户输入、槽位值、会话信息传给Lambda,等Lambda返回结果后再把响应回传给你的客户端。 - 第二步:Lambda环境准备
- 依赖处理:Lambda默认Node.js运行时没有预装MongoDB驱动,你可以本地初始化Node.js项目安装
mongodb依赖,把代码和node_modules一起打包成zip上传到Lambda;也可以单独制作一个包含mongodb驱动的Lambda层挂载使用,减少后续代码包体积。 - 网络配置:如果你的MongoDB是公网可访问的实例,给Lambda配置公网出口即可;如果MongoDB部署在私有VPC内,给Lambda绑定对应VPC的子网和安全组,放通到MongoDB服务端口的访问规则。
- 安全配置:不要把MongoDB连接地址、账号密码硬编码在代码里,把这类敏感配置存在Lambda环境变量或者Secrets Manager里,运行时动态读取。
- 依赖处理:Lambda默认Node.js运行时没有预装MongoDB驱动,你可以本地初始化Node.js项目安装
- 第三步:Lambda代码实现注意点
- Lex V2传入Lambda的事件结构和V1版本不兼容,不要直接套用网上V1版本的解析代码:从
event.sessionState.intent.name判断当前触发的意图,从event.interpretations[0].intent.slots里取用户填好的槽位参数,从event.sessionState.sessionAttributes取会话上下文信息。 - 查库逻辑用async/await写法,不要用嵌套回调;把MongoDB的连接实例缓存到Lambda全局作用域,不用每次触发都新建连接,既可以降低冷启动耗时,也不会占满MongoDB的连接数。
- Lambda返回给Lex的响应必须符合V2的格式要求:把查库拿到的结果放到
messages数组作为返回给用户的内容,同时把sessionState.dialogAction.type设为Close、sessionState.intent.state设为Fulfilled,Lex收到这个结构的响应就会把结果回传给你的客户端,走你现有的recognizeUtterance回调逻辑接收即可。
- Lex V2传入Lambda的事件结构和V1版本不兼容,不要直接套用网上V1版本的解析代码:从
踩坑提示:Lambda默认超时时间是3秒,如果你的查库逻辑耗时比较长,记得把Lambda的超时时间适当调长,同时给MongoDB操作加异常捕获,避免异常时Lambda直接报错,用户收不到响应。
内容的提问来源于stack exchange,提问作者Felix Christo
相关产品推荐
相关产品推荐

