2013-02-20 2 views
1

Я хочу, чтобы понять, что правильный способ обновить экземпляр модели, с использованием мангуста, то есть:Обновления экземпляра модели

Наличие:

User = { 
    username: { 
     type: String, 
     indexed: true 
    }, 
    email: { 
     type: String, 
     indexed: true 
    }, 
    name: String, 
    ......... 
}; 

Я посылаю всю форму через Аякс контроллер.
До сих пор, я знаю два варианта:

app.put('/users/', function(req, res){ 
    var id = ObjectId(req.body._id); 
    User.findOne({_id: id}, function(err, user){ 
     user.name = req.body.name; 
     .... 
     .... 
     user.save(); 
    }); 
}); 

или:

app.put('/users/', function(req, res){ 
    var id = ObjectId(req.body._id); 
    delete req.body._id 
    User.update({_id: id}, req.body, function(err){ 
     ..... 
    }; 
}); 

Оба способа имеют недостатки:
В первом подходе я должен отобразить все свойства по одному;
Во втором подходе я должен удалить все свойства, которые нельзя изменить;
есть третий возможный подход, который заставит меня отправлять с клиентской стороны только измененные свойства, но я думаю, что это будет большой проблемой.

Есть ли хороший, стандартизованный способ, который я не вижу, чтобы сделать это?

Благодаря

+1

лицу, проголосовавшему: по крайней мере, вы могли бы объяснить свой голос в комментарии ... –

ответ

1

Вариант первого подхода заключается в том, чтобы использовать extend метод Underscore, чтобы применить все свойства организма к вашей модели, например:

app.put('/users/', function(req, res){ 
    var id = ObjectId(req.body._id); 
    User.findOne({_id: id}, function(err, user){ 
     _.extend(user, req.body); 
     user.save(); 
    }); 
}); 

Однако, не забудьте удалить любые свойства, дон Не хотите, чтобы пользователь мог установить с req.body.

+0

спасибо, но этот способ имеет те же проблемы из моего первого подхода. Ницца должен был иметь метод, который делает противоположное от расширения, т. Е. Создает третий объект, который имел только свойства, которые отличались от тех же двух. –

+0

@ AndréAlçadaPadez Не уверен, что вы имеете в виду о тех же проблемах, что и первый подход. Вам больше не нужно отображать их по одному. – JohnnyHK

+0

Я говорил о проблемах второго подхода, удаленные –

2

Это подход, который я обычно использую, она включает в себя небольшой НПЙ пакет под названием Мангуст-масс-: присваивания

https://github.com/bhelx/mongoose-mass-assignment

Документы довольно понятен, прост в использовании. Это в основном делает для вас удаление. Таким образом, вы добавляете protected:true к своей модели, а затем удаляете эти свойства для себя. Мне нравится этот подход, потому что он все еще позволяет мне использовать req.body как есть. Вы можете использовать это для обновлений и вставок.

+0

кажется классным, подумал, что он добавляет немного накладных расходов, чтобы обновить мой код везде, чтобы использовать massAssign. –

+0

О, один вопрос, это не рассматривается в документах, вам все еще нужно удалить body._id? –

+0

Вам больше не нужно ничего удалять, если вы спрашиваете, нужно ли вам «защищать» идентификатор, тогда я бы ответил, что и вы, возможно, тоже. Я не вижу вреда в этом. – BFree