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

