You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React新手遇Cannot read properties of undefined(affiliateStats)错误求解

错误"Cannot read properties of undefined (reading 'affiliateStats')"的原因与修复

错误原因

这个错误触发在userWithStats[0].affiliateStats代码行,本质是尝试读取undefined的属性,具体场景分为三种:

  • 传入的id未匹配到任何用户:$match阶段无查询结果,userWithStats为空数组,userWithStats[0]为undefined。
  • 匹配到的用户无关联affiliateStats记录:$lookup返回空数组,后续$unwind会直接移除该用户,导致userWithStats为空数组。
  • $lookup的from参数错误:mongoose默认使用模型名的小写复数作为集合名,若你的AffiliateStats模型对应集合名不是affiliatestats(比如写成affiliateStats),会导致关联查询无结果,最终触发$unwind移除用户。

修复方案

针对上述问题,需增加空值校验、优化聚合流程,并确保集合名正确:

1. 提前处理无结果场景

在访问userWithStats[0]前,先判断数组是否为空,直接返回对应错误提示。

2. 优化$unwind阶段

给$unwind添加preserveNullAndEmptyArrays: true选项,避免无关联统计的用户被过滤,后续再处理空值情况。

3. 确认集合名正确性

核对AffiliateStats模型对应的MongoDB集合名,确保$lookup的from参数与实际集合名一致。

修复后的代码

import mongoose from "mongoose";
import User from "../models/User.js";
import Transaction from "../models/Transaction.js";

export const getAdmins = async (req, res) => {
  try {
    const admins = await User.find({ role: "admin" }).select("-password");
    res.status(200).json(admins);
  } catch (error) {
    res.status(404).json({ message: error.message });
  }
};

export const getUserPerformance = async (req, res) => {
  try {
    const { id } = req.params;

    const userWithStats = await User.aggregate([
      { $match: { _id: new mongoose.Types.ObjectId(id) } },
      {
        $lookup: {
          from: "affiliatestats", // 确认此处集合名与实际MongoDB集合一致
          localField: "_id",
          foreignField: "userId",
          as: "affiliateStats",
        },
      },
      { $unwind: { path: "$affiliateStats", preserveNullAndEmptyArrays: true } },
    ]);

    // 处理用户不存在的情况
    if (!userWithStats.length) {
      return res.status(404).json({ message: "用户不存在" });
    }

    const user = userWithStats[0];
    let filteredSaleTransactions = [];

    // 仅当存在有效关联销售记录时才查询交易数据
    if (user.affiliateStats?.affiliateSales?.length) {
      const saleTransactions = await Promise.all(
        user.affiliateStats.affiliateSales.map((transactionId) => {
          return Transaction.findById(transactionId);
        })
      );
      filteredSaleTransactions = saleTransactions.filter(
        (transaction) => transaction !== null
      );
    }

    res.status(200).json({ user, sales: filteredSaleTransactions });
  } catch (error) {
    res.status(404).json({ message: error.message });
  }
};

内容的提问来源于stack exchange,提问作者Faridz Kurnia Chandra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 09:35:27