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

Mongoose虚拟属性异步get函数无法返回值问题排查

Mongoose虚拟属性categoryName返回{}的问题解决

你代码里的虚拟属性getter用了async函数,它会返回一个Promise对象。Mongoose在将文档序列化为JSON时,不会等待这个Promise完成,直接把Promise对象转成了JSON,所以响应里的categoryName字段显示为{}。

解决方法:

  • 改用populate关联查询(推荐)
    先把categoryId定义为引用类型:

    const testSchema = new mongoose.Schema({
      // 其他字段
      categoryId: { type: mongoose.Schema.Types.ObjectId, ref: 'Category' }
    });
    

    查询时通过populate直接关联查询分类名称:

    const testDocs = await TestModel.find().populate('categoryId', 'name');
    

    之后可以将结果处理成需要的格式,比如:

    const responseData = testDocs.map(doc => {
      const obj = doc.toObject();
      obj.categoryName = obj.categoryId.name;
      // 可选:删除原categoryId字段
      delete obj.categoryId;
      return obj;
    });
    
  • 用查询钩子手动添加字段
    如果不想修改查询方式,可以给Schema添加post查询钩子,同时优化N+1查询问题:

    testSchema.post('find', async function(docs) {
      const categoryIds = docs.map(doc => doc.categoryId);
      const categories = await Category.find({ _id: { $in: categoryIds } });
      const catMap = new Map(categories.map(cat => [cat._id.toString(), cat.name]));
      
      docs.forEach(doc => {
        doc.categoryName = catMap.get(doc.categoryId.toString());
      });
    });
    

内容的提问来源于stack exchange,提问作者Ianuoui

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 20:24:55