React Native Dialogflow项目未处理Promise rejection及NativeEventEmitter警告求解
问题排查及解决步骤
1 解决NativeEventEmitter相关警告
该警告是react-native-dialogflow库长期未更新,不兼容你当前使用的React Native版本导致的,库内部NativeEventEmitter的实现没有适配新版本RN的接口要求,两种解决方案可选:
- 临时屏蔽方案:在你项目的入口文件(通常是index.js)头部添加以下代码
import { NativeModules, NativeEventEmitter } from 'react-native'; const originalEmitter = NativeEventEmitter; NativeEventEmitter = class extends originalEmitter { constructor(nativeModule) { super(nativeModule); if (nativeModule && !nativeModule.addListener) { nativeModule.addListener = () => {}; } if (nativeModule && !nativeModule.removeListener) { nativeModule.removeListener = () => {}; } } };
- 长期兼容方案:该库已经停止维护,后续可以直接调用Dialogflow的REST接口发起请求,替换掉这个过时的第三方依赖。
2 解决发送消息后无回复+未处理Promise拒绝问题
按以下顺序排查即可:
- 检查
env.js配置:确认client_email、private_key、project_id三个参数和你从Dialogflow后台下载的服务账户密钥文件完全一致,private_key不要删减首尾的-----BEGIN PRIVATE KEY-----\n和\n-----END PRIVATE KEY-----\n部分,也不要额外添加转义字符。 - 检查模拟器网络:打开模拟器自带的浏览器访问外网确认网络连通,Dialogflow接口请求需要正常的外网访问环境才能成功,你当前的报错本质就是接口请求失败触发的。
- 补充请求判断和错误捕获:修改代码里的请求逻辑,避免结果结构异常或请求失败导致的报错,修改后的
requestQuery调用参考如下:
Dialogflow_V2.requestQuery( message, (result) => { // 增加返回结果空判断,避免结构异常报错 if(result?.queryResult?.fulfillmentMessages?.[0]?.text?.text?.[0]){ this.handleGoogleResponse(result) }else{ this.sendBotResponse("我暂时没办法回答这个问题哦") } }, (error) => { console.log(error) this.sendBotResponse("请求出错了,请稍后再试") } )
- 检查Dialogflow后台权限:确认你创建的服务账户角色已经配置了Dialogflow API Client权限,代理的API访问功能已经开启。
内容的提问来源于stack exchange,提问作者vanhook
相关产品推荐
相关产品推荐

