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
相关产品推荐
相关产品推荐

