2016-11-03 3 views
1

У меня возникли проблемы с выяснением, правильно ли я построил схему, потому что при попытке изменения PATCH свойства role из профиля я получаю ошибку 500. (Примечание: Ошибка 500 раз отвечает пустой {}, так что это на самом деле не информативен)Mongoose Subdocument не обновляется

Ниже профиля схемы:

var ProfileSchema = new Schema({ 
    name: { 
    type: String, 
    required: true 
    }, 
    roles: [{ 
    application: { 
     type: Schema.Types.ObjectId, 
     required: true, 
     ref: 'Application' 
    }, 
    role: { 
     type: String, 
     required: true, 
     enum: [ 'admin', 'author', 'publisher' ] 
    } 
    }] 
}); 

Каждый профиль имеет определенную роль для приложения, и когда Я посылаю запрос на действие контроллера «обновление», он не:

профиля контроллера обновления:

// Updates an existing Profile in the DB 
export function update(req, res) { 
    try { 
    if (req.body._id) { 
     delete req.body._id; 
    } 

    console.log('ENDPOINT HIT...'); 
    console.log(`REQUEST PARAM ID: ${req.params.id}`); 
    console.log('REQUEST BODY:'); 
    console.log(req.body); 
    console.log('ENTIRE REQUEST: '); 

    return Profile.findByIdAsync(req.params.id) 
    .then(handleEntityNotFound(res)) 
    .then(saveUpdates(req.body)) 
    .then(respondWithResult(res)) 
    .catch(handleError(res)); 

} catch(ex) { 
    console.error('FAILED TO UPDATE PROFILE'); 
    return handleError(res); 
    } 
} 

Я удостоверился, что идентификатор и тело отправляются правильно, и я нахожусь в конечной точке.

Это пример JSON запроса тела:

{ 
    _id: 57e58ad2781fd340563e29ff, 
    __updated: Thu Oct 27 2016 15:41:12 GMT-0400 (EDT), 
    __created: Fri Sep 23 2016 16:04:34 GMT-0400 (EDT), 
    name: 'test', 
    __v: 11, 
    roles:[ 

    { application: 57b70937c4b9fe460a235375, 
    role: 'admin', 
    _id: 58125858a36bd76d8111ba16 }, 

    { application: 581b299f0145b48adf8f57bd, 
    role: 'publisher', 
    _id: 581b481898eefb19ed8a73ee } 
    ] 

} 

Когда я пытаюсь найти анкеты Id, обещание цепи идет прямо в улове (HandleError (Рез)); часть кода и показывает пустой объект в моей консоли.

Моя функция ошибки ручки:

function handleError(res, statusCode) { 
    console.error('HANDLE PROFILE ERROR: ', statusCode); 
    statusCode = statusCode || 500; 
    return function(err) { 
    console.error('PROFILE ERROR:'); 
    console.error(JSON.stringify(err, null, 2)); 
    res.status(statusCode).send(err); 
    }; 
    } 

UPDATE

Я осознав код разрывается, когда она попадает мой saveUpdates функции (Примечание: Я использую lodash):

function saveUpdates(updates) { 
    /// the code is fine here /// 
    return function(entity) { 
    /// once it enters in here, is where it begins to break /// 
    var updated = _.merge(entity, updates); 

    if(updated.roles.length != updates.roles.length) { 
     updated.roles = updates.roles; 
    } 

    for(var i in updates.roles) { 
     updated.roles.set(i, updates.roles[i]); 
    } 
    return updated.saveAsync() 
    .then(updated => { 
     return updated; 
     }); 
    }; 
} 
+0

, чтобы увидеть ошибку 'findByIdAsync (...). Catch ((err) => {console.log (err); handleError (res);})' –

+0

Можете ли вы рассказать нам, что находится на 'req. params.id' точно, пожалуйста? что показано вам в 'console.log (\' REQUEST PARAM ID: $ {req.params.id} \ ');' –

+0

@ GrégoryNEUT, когда я console.log params.id - это то, что я получаю : 'ЗАПРОС PARAM ID: 57bd9db4f33dcd03c3fd9990' –

ответ

0

Извлеченный урок: правильно прочитайте документацию.

Поскольку я использую обещания bluebird для этого приложения, я забыл использовать .spread() в моей функции обратного вызова saveUpdates().

Решение:

function saveUpdates(updates) { 
    return function(entity) { 
    var updated = _.merge(entity, updates); 
    if(updated.roles.length != updates.roles.length) { 
     updated.roles = updates.roles; 
    } 

    for(var i in updates.roles) { 
     updated.roles.set(i, updates.roles[i]); 
    } 

    return updated.saveAsync() 
     // use `.spread()` and not `.then()` // 
     .spread(updated => { 
     return updated; 
     }); 
    }; 
} 

Я хочу поблагодарить следующий SOA, которые привели к такому выводу: https://stackoverflow.com/a/25799076/5994486

Кроме того, здесь есть ссылка на Bluebird документации в случае, если кто был любопытная на .spread(): http://bluebirdjs.com/docs/api/spread.html

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