2014-09-14 3 views
1

У меня возникла проблема с базовым запросом. Все свойства модели mongoose I fetch не определены в обратном вызове exec().Модель Mongoose получает неопределенные свойства после популяции

Вот моя схема:

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 } 
    }) 

Вы уже можете заметить, что моя собственность «друзей» представляет собой массив объектов, ссылающихся на другую схему.

Теперь вот мой запрос:

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); 
    } 
}); 

Когда это возвращение веб-сервис «_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; 
}; 

Я пытался установить тайм-аут, чтобы увидеть, если проблема возникла из асинхронной, но это ничего не изменило , В этот раз я немного отчаянно желаю, и я хотел знать, если вы уже сталкивались с той же проблемой раньше?

+1

сделал друг получить правильно показано в console.log всего объекта пользователя? вы console.log объект друзей повсюду, и он выводил undefined ожидать в методе cleanResults? –

+0

Привет, материк и спасибо. Когда я печатаю весь объект пользователя, пользователи user.friends уже заполнены, все в порядке. Да, я вывел user.friends в каждом из моих комментариев, и это было неопределено до метода cleanResults. – cocoggu

+0

Хорошо. дай мне минуту. Я попытаюсь воспроизвести его. –

ответ

2

Я вижу вашу проблему, вы случайно использовали find, когда вы ожидаете возвращения только одного объекта. В этом случае, вы должны использовать findById:

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

Спасибо, что он работает как шарм! Я не могу понять, почему 'find' не работает, так как некоторые запросы могут ожидать возврата одного или нескольких объектов ... – cocoggu

+0

find вернет список пользователей, вы могли бы использовать find, чтобы потом добавить пользователей и вам нужно было получить одного из таких пользователей: var user = users [0] или что-то в этом роде. –

+0

aaaah Я не заметил скобки массивов в то время, когда я напечатал весь пользовательский объект. Спасибо !!! – cocoggu

Смежные вопросы