后端Bug汇总
邓新宇:
- 位置: Buaa.AIBot.Repository.Implement.QuestionRepository.UpdateQuestionAsync
- 级别: 一般情况下, 导致陷入死循环.
- 描述: 更新问题信息时, 会导致系统陷入死循环.
- 原因: 这是由于这一部分是拷贝InsertQuestionAsync的实现然后进行修改的, 而后者创建了QuestionData对象后, 需要将其插入数据库, 但前者是不需要, 由于插入的重试机制, 将无限重试, 陷入死循环.
- 解决情况: 顺利解决. 同时引入了重试的超时机制, 确保类似的问题不会陷入死循环.
- 位置: Buaa.AIBot.Repository.Implement.QuestionRepository.UpdateQuestionAsync
- 级别: 特殊情况下, 后端报错.
- 描述: 当不更新问题的标签时, 将抛出空引用异常.
- 原因: QuestionRepository通过Buaa.AIBot.Repository.Implement.QuestionRepository.TagMatcher进行标签匹配, TagMatcher在创建时需要通过传入的Tags列表初始化一个HashSet, 而当不更新Tags时, Tags列表为null, 此时将会报错.
- 解决情况: 顺利解决.
- 位置: Buaa.AIBot.Repository.Implement.QuestionRepository.UpdateQuestionAsync
- 级别: 特殊情况下, 发生一致性错误, 导致语义错误.
- 描述: 当更新问题信息中的最佳回答信息时, 若该回答并不属于该问题时仍能够成功, 此时一个问题的最佳回答并不属于该问题, 语义错误.
- 原因: 更新时仅检查了回答是否存在, 没有检查该回答所属问题是不是本回答.
- 解决情况: 顺利解决.
- 位置: Buaa.AIBot.Repository.Implement.QuestionRepository.UpdateQuestionAsync
- 级别: 高并发的特殊情况下, 发生数据丢失错误.
- 描述: 当更新问题信息的标签信息时, 若在更新
标签-问题
表时,标签
表删除了某个被选中的标签时, 将会导致整个问题被删除. - 原因: 上述情况发生时, 应当视为操作失败, 应当撤销之前的更改, 但是由于实现的错误, 导致问题被删除, 这是由于这一部分是拷贝InsertQuestionAsync的实现然后进行修改的, 后者的
撤销
自然就是删除. - 解决情况: 经过分析, 虽然本函数需要更改
问题
表和标签-问题
表两个表, 但是并不像InsertQuestionAsync那样需要先插入问题
表以获得问题的qid, 而不得不分两步完成, UpdateQuestionAsync只需要一次数据库数据的提交即可完成. 最后顺利修复.
- 位置: Buaa.AIBot.Repository.Implement.UserRepository.InsertUserAsync
- 级别: 代码编写错误的特殊情况下, 错误调用本方法未能报告错误.
- 描述: 当调用方未初始化UserInfo.Auth时未能报告错误.
- 原因: 接口设计时, 为每个引用类型设置了null检查, 但是Auth对应的时枚举类, 故遗漏了检查.
- 解决情况: 添加了对当Auth为AuthLevel.None时的报错, 同时更新了Buaa.AIBot.Repository.IUserRepository.InsertUserAsync中的描述. 顺利解决.
- 位置: Buaa.AIBot.Repository.Implement.AnswerRepository.InsertAnswerAsync
- 级别: 特殊情况下, 发生一致性错误, 导致语义错误.
- 描述: 创建新的回答时, 未检查创建者CreaterId的合法性, 导致CreaterId未对应任何用户时, 仍能够插入成功.
- 原因: 由于数据模型设计时, 为了实现
用户删除后其回答不会被
的功能, 未添加对CreaterId的强制约束, 但是语义上, 创建问题时应当保证用户存在. - 解决情况: 添加了对当CreaterId为null时的报错, 同时更新了Buaa.AIBot.Repository.IAnswerRepository.InsertAnswerAsync中的描述. 顺利解决.
- 位置: Buaa.AIBot.Services.QuestionService.ModifyAnswerAsync
- 级别: 一般情况下, 后端报错.
- 描述: 调用该方法时, 即使待修改的回答时存在的, 仍旧会报错回答不存在.
- 原因: 调用Buaa.AIBot.Repository.Implement.AnswerRepository.UpdateAnswerAsync方法时, 少传了AnswerInfo.AnswerId参数.
- 解决情况: 顺利解决.
- 位置: Buaa.AIBot.Repository.Implement.QuestionRepository.SelectQuestionsByTagsAsync
- 级别: 一般情况下, 后端报错.
- 描述: 无论如何, 总会报错. 导致/api/questions/questionlist总是报错.
- 原因:
EF Core
对LINQ中GroupBy和Where支持有限, 导致原代码构建的表达式树无法转换为SQL语句, 从而导致了报错. 改为直接通过RawSql语句进行查询后, 由于开发环境为Windows, 生产/测试环境为Linux, 前者MySQL表名不区分大小写, 而后者区分, 导致过无法正确运行, 目前已解决该问题. - 解决情况: 目前可以工作, 但是实现较为低下, 已有一定方案进行优化, 但是尚未进行.
- 位置:
- Buaa.AIBot.Repository.Implement.QuestionRepository.SelectAnswersForQuestionByIdAsync
- Buaa.AIBot.Repository.Implement.QuestionRepository.SelectTagsForQuestionByIdAsync
- Buaa.AIBot.Repository.Implement.UserRepository.SelectAnswersIdByIdAsync
- Buaa.AIBot.Repository.Implement.UserRepository.SelectAnswersIdByIdByModifyTimeAsync
- Buaa.AIBot.Repository.Implement.UserRepository.SelectQuestionsIdByIdAsync
- Buaa.AIBot.Repository.Implement.UserRepository.SelectQuestionsIdByIdOrderByModifyTimeAsync
- 级别: 导致功能缺失.
- 描述: 无论是否创建了问题和回答, 是否为问题添加了相关标签, 都会导致通过用户搜索用户问答的问题和提出的问题, 以及通过问题搜索对应的回答和标签时, 将永远返回空列表. 导致以下接口无法正常工作(永远返回空列表, 或其中某部分为空列表):
- /api/user/questions
- /api/user/answers
- /api/questions/question
- 原因: 错误地理解了
EF Core
对于一对多关系的加载策略, 误认为该关系是自动而主动由数据库加载到内存的, 事实上需要特定操作进行加载. - 解决情况: 顺利解决.
李明昕:
-
位置:
Buaa.AIBot.Controllers.UserController.GetInternalInfoAsync
-
级别:比较严重,导致API无法正常响应。
-
描述:在请求用户内部信息的时候总是返回404NotFound。
-
原因:在判断是否存在该用户时逻辑写反了。
-
解决情况:修复了判断逻辑,现在能正常判断用户是否存在并获取其内部信息。
-
位置:
Buaa.AiBot.Controllers.UserController.FreshAsync
-
级别:比较严重,导致无法更新令牌。
-
描述:在JWT令牌未过期时请求更新令牌失败。
-
原因:从请求中获取令牌的位置出现了错误,主要涉及到两个方法
- UserService.FreshTokenAsync
- UserService.GetExpirationFromToken
这两个方法都错误地从请求参数中获取JWT令牌,使得令牌获取失败,进而导致无法更新令牌。
-
解决情况:修复了令牌获取方式,现在令牌可以正确地从请求体中得到。
-
位置:
Buaa.AIBot.Controllers.QuestionsController.AddAnswerAsync
-
级别:一般严重,使得后端在一定情况下会产生错误。
-
描述:如果一个问题不存在的时候回答该问题会产生错误。
-
原因:调用Buaa.AIbot.Services.IQuestionService.AddAnswerAsync是未接住其抛出的QuestionNotExistException。
-
解决情况:成功解决,正确接住了并处理了其抛出的异常。
-
位置:
Buaa.AIBot.Controllers.UserController.SignUpAsync
-
级别:不太严重,主要影响前端人员测试
-
描述:无法创建管理员用户
-
原因:在控制层实现signup api时,没有考虑到增加管理员用户的需求。
-
解决情况:在signup逻辑中增加了添加管理员账户逻辑。
-
位置:
Buaa.AIBot.Repository.BaiduCrawlerRepository.onCompleted
-
级别:不太严重,主要影响的时处理效率。
-
描述:在使用正则表达式处理爬取的数据时效率较低。
-
原因:错误地在一个循环中进行了多余的正则替换
-
解决情况:将正则替换移到循环外,提高了处理效率。