连接MongoDB导致Dialogflow配套Python程序无返回问题求助
问题定位及解决方法
- 1 首先修复基础语法错误
你提供的configureDataBase()函数存在缩进错误,Python中函数体内的代码必须缩进4个空格,你写的client = MongoClient("connection URL")没有缩进,不属于函数体代码,会在函数定义阶段就尝试执行数据库连接,抛出的异常会直接中断程序运行。
修正后的函数代码如下:
def configureDataBase(): # 新增超时参数,3秒连接失败直接抛出异常,避免长时间阻塞 client = MongoClient("你的MongoDB连接URL", connectTimeoutMS=3000, serverSelectionTimeoutMS=3000) return client.get_database('Covid_19_DB')
- 2 解决连接阻塞超时问题
Dialogflow对webhook的响应超时限制为5秒,默认MongoClient没有设置连接超时,遇到网络不通、权限不足的情况会一直阻塞等待连接,导致webhook超时被强制中断,没有返回结果。
除了上面给MongoClient添加超时参数外,建议将数据库连接改为全局初始化,不要每次处理请求都新建连接:既可以减少连接耗时,也能避免连接数占满MongoDB服务。 - 3 新增异常捕获避免主流程中断
数据库操作属于可降级的旁路逻辑,即使存储失败也不应该影响疫情查询结果的返回。把数据库写入操作包裹在try-except块中,捕获异常后只打印错误日志,不中断主流程返回,修改后的核心逻辑参考:
# 全局初始化一次数据库连接,不用每次请求都重复创建 db = configureDataBase() def webhook处理函数(req): log = Conversations.Log() sessionID = req.get('responseId') result = req.get("queryResult") intent = result.get("intent").get('displayName') query_text = result.get("queryText") parameters = result.get("parameters") cust_name = parameters.get("cust_name") cust_contact = parameters.get("cust_contact") cust_email = parameters.get("cust_email") if intent == 'covid_searchcountry': cust_country = parameters.get("geo-country") if(cust_country=="United States"): cust_country = "USA" fulfillmentText, deaths_data, testsdone_data = makeAPIRequest(cust_country) webhookresponse = "***Covid Report*** \n\n" + " New cases :" + str(fulfillmentText.get('new')) + \ "\n" + " Active cases : " + str( fulfillmentText.get('active')) + "\n" + " Critical cases : " + str(fulfillmentText.get('critical')) + \ "\n" + " Recovered cases : " + str( fulfillmentText.get('recovered')) + "\n" + " Total cases : " + str(fulfillmentText.get('total')) + \ "\n" + " Total Deaths : " + str(deaths_data.get('total')) + "\n" + " New Deaths : " + str( deaths_data.get('new')) + \ "\n" + " Total Test Done : " + str(testsdone_data.get('total')) + "\n\n*******END********* \n " print(webhookresponse) # 数据库操作捕获异常,不影响主流程返回 try: log.saveConversations(sessionID, cust_country, webhookresponse, intent, db) log.saveCases( "country", fulfillmentText, db) except Exception as e: print(f"数据库存储失败:{str(e)}") return { "fulfillmentMessages": [ { "text": { "text": [ webhookresponse ] } }, { "text": { "text": [ "Do you want me to send the detailed report to your e-mail address? Type.. \n 1. Sure \n 2. Not now " ] } } ] }
- 4 排查网络与权限配置
如果修改后仍然有问题,按以下顺序检查配置:- 如果你使用的是云MongoDB服务,需要把你部署webhook服务的服务器IP添加到数据库的访问白名单中
- 确认连接字符串中的用户名、密码、集群地址拼写正确,特殊字符要做URL转义
- 测试webhook服务所在的服务器能否正常连通MongoDB的默认端口27017
另外你原代码里还有一处笔误:Total Test Done取值错用了deaths_data,已经在上面的示例中修正为testsdone_data。
内容的提问来源于stack exchange,提问作者Nayeer Mahiuddin
相关产品推荐
相关产品推荐

