猫鼬模型在填充后获得未定义的属性

Posted

技术标签:

【中文标题】猫鼬模型在填充后获得未定义的属性【英文标题】:Mongoose model get undefined properties after population 【发布时间】:2014-11-08 09:17:24 【问题描述】:

我遇到了一个基本请求问题。 我获取的猫鼬模型的所有属性都未在 exec() 回调中定义。

这是我的架构:

userSchema: new Schema(
    email:  type: String, limit: 50, index: true ,
    password: String,
    birthdate:  type: Date ,
    active:  type: Boolean, default: true ,
    friends: [
      _friend:  type: Schema.ObjectId, ref: 'User' ,
      addedDate:  type: Date, default: Date.now 
    ],
    registrationDate:  type: Date, default: Date.now 
  )

您已经注意到我的“friends”属性是一个引用另一个模式的对象数组。

现在这是我的查询:

dbModels.User
.find( _id: req.session.user._id )
.populate('friends._friend', 'email birthdate')
.exec(function (err, _user)
  if (err || !_user)
    apiUtils.errorResponse(res, sw, 'Error when fetching friends.', 500);
   else 

    console.log('user', _user);
    // This output the object with all its properties

    console.log('user birthdate', _user.birthdate);
    // _user.birthdate is undefined

    console.log('user friends', _user.friends);
    // _user.friends is undefined

    apiUtils.jsonResponse(res, sw, _user);
  
);

当此 Web 服务返回“_user”时,每个属性都已明确定义并具有正确的值。 问题是我只想返回 _user.friends 这是不可能的,因为它是未定义的。

现在,这里是 apiUtils.jsonResponse 函数:

exports.jsonResponse = function (res, sw, body) 

  console.log(body.friends);
  // At this breakpoint, body.friends is still undefined

  (sw || _sw).setHeaders(res);
  if (util.isArray(body)) 
    for (var i = 0; i < body.length; i++) 
      body[i] = exports.cleanResults(body[i]);
    
   else 

    console.log(body.friends);
    // At this breakpoint body.friends is still undefined

    body = exports.cleanResults(body);
  
  res.send(httpCode || 200, JSON.stringify(body));
;

还有 cleanResults 函数:

exports.cleanResults = function (body) 

  console.log(body.friends);
  // At this point, body.friends is FINALLY DEFINED

  if (typeof body.toObject === 'function') 
    body = body.toObject();
    delete body.__v;
  

  for (var attr in body) 
    if (body.hasOwnProperty(attr) && attr[0] == '_') 
      var _attr = attr.replace('_', '');
      body[_attr] = body[attr];
      delete body[attr];
    
  
  return body;
;

我尝试设置超时以查看问题是否来自异步,但它没有任何改变。我此时有点绝望,想知道你之前有没有遇到过同样的问题?

【问题讨论】:

朋友是否在整个用户对象的 console.log 中正确显示?您是否在任何地方都控制台记录了朋友对象,并在 cleanResults 方法中输出了未定义的期望? 您好,谢谢您。当我打印整个用户对象时,user.friends 已经被填充,一切都很好。是的,我在每个 cmets 上都输出了 user.friends,在 cleanResults 方法之前它是未定义的。 好的。给我一点时间。我会尝试复制它。 找到了问题:p 看我的回答。 【参考方案1】:

我看到了您的问题,当您希望只返回一个对象时,您不小心使用了find。在这种情况下,您应该使用findById

User
    .findById(req.session.user._id)
    .populate('friends._friend', 'name surname picture birthdate')
    .exec(function(err, user) 
        ...
    )

【讨论】:

非常感谢它的工作就像一个魅力!我不知道为什么find 不起作用,因为某些请求可能期望返回一个或多个对象... find 将返回一个用户列表,您可以使用 find 到那时您将添加返回的用户并且您必须像这样获取其中一个用户:var user = users[0],或者东西。 aaaah 在打印整个用户对象时我没有注意到数组括号。谢谢!!!

以上是关于猫鼬模型在填充后获得未定义的属性的主要内容,如果未能解决你的问题,请参考以下文章

带有猫鼬的打字稿:无法读取未定义的属性“CasterConstructor”

Express,第二次调用then()函数,用猫鼬保存对象后返回未定义对象

如果文件未导出,如何使用在单独文件中定义的猫鼬模型?

无法读取未定义猫鼬的属性“长度”

猫鼬填充未填充必填字段

为啥不断在 codeigniter 上获得未定义的属性?