基本的なリクエストで問題が発生しました。私が取得したマングース モデルのすべてのプロパティは、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;
};
問題が非同期に起因するかどうかを確認するためにタイムアウトを設定しようとしましたが、何も変わりませんでした。現時点では少し絶望的で、以前に同じ問題に遭遇したかどうかを知りたかったのですか?