猫鼬模型在填充后获得未定义的属性
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”