获取已购电影接口返回空对象且200响应问题求助
问题排查与修复方案
核心问题分析
购买功能正常但获取已购电影接口返回200和空对象,说明数据已成功入库,但查询链路或用户身份识别环节存在异常。
排查与修复步骤
1. 修正用户ID获取逻辑
控制器中GetLoggetInUserId方法可能获取到无效的用户ID,导致查询无结果:
- 验证
HttpContext.User.Claims中是否存在键为"UserId"的合法Claim - 添加空值校验与日志输出,避免无效转换:
[HttpGet("CurrentUser")] public int GetLoggetInUserId() { var userIdStr = HttpContext.User.FindFirstValue("UserId"); if (string.IsNullOrEmpty(userIdStr) || !int.TryParse(userIdStr, out int id)) { _logger.LogError("无法从身份凭证中获取有效用户ID"); throw new UnauthorizedAccessException("用户身份验证失败"); } _logger.LogInformation("当前用户ID: {UserId}", id); return id; }
2. 修复空集合判断逻辑
仓储层CartItems方法返回ToListAsync(),结果永远不会为null,只会是空集合。原控制器中的if (cartItems == null)判断永远不会触发:
- 改为判断集合是否为空:
var cartItems = await this.shoping.CartItems(userId); if (!cartItems.Any()) { return NoContent(); }
3. 验证仓储层查询逻辑
检查Cart与CartItem的关联是否正确,可添加日志输出查询SQL:
public async Task<IEnumerable<CartItem>> CartItems(int UserId) { var query = from cart in this.context.Cart join cartItem in this.context.CartItem on cart.Id equals cartItem.CartId where cart.UserId == UserId select new CartItem { Id = cartItem.Id, MovieId = cartItem.MovieId, mengde = cartItem.mengde, CartId = cartItem.CartId, }; _logger.LogInformation("购物项查询SQL: {Sql}", query.ToQueryString()); return await query.ToListAsync(); }
4. 检查DTO转换逻辑
若cartItems有数据但转换后为空,需验证ConvertToDto方法:
- 确保该方法正确通过
MovieId关联电影数据,示例修复逻辑:
public static IEnumerable<CartItemDTO> ConvertToDto(this IEnumerable<CartItem> cartItems, IEnumerable<Movie> movies) { return cartItems.Select(item => new CartItemDTO { Id = item.Id, MovieId = item.MovieId, Mengde = item.mengde, Movie = movies.FirstOrDefault(m => m.Id == item.MovieId) }).Where(dto => dto.Movie != null); // 过滤无对应电影的无效记录 }
5. 直接验证数据库数据
手动查询数据库确认:
- 目标用户的
Cart记录存在 - 该
Cart关联的CartItem记录已正确创建,且MovieId有效
内容的提问来源于stack exchange,提问作者Solin Hassan
相关产品推荐
相关产品推荐

