2016-03-30 2 views
0

Я изучаю Угловое, следуя этому tutorial. Я не понимаю, почему существует два способа сохранения/редактирования объекта? Они действительно не объясняют это.Сохранение объектов двумя способами, в чем разница?

первый путь (в index.js маршрутизаторе):

router.post('/posts', function(req, res, next) { 
    var post = new Post(req.body); 

    post.save(function(err, post) { 
     if (err) { return next(err); } 

     res.json(post); 
    }); 
}); 

второй путь (в модели мангустов):

var mongoose = require('mongoose'); 

var PostSchema = new mongoose.Schema({ 
    title: String, 
    link: String, 
    upvotes: { type: Number, default: 0 }, 
    comments: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Comment' }] 
}); 

PostSchema.methods.upvote = function(cb) { 
    this.upvotes += 1; 
    this.save(cb); 
}; 

mongoose.model('Post', PostSchema); 
+1

Ничего из этого не имеет отношения к Угловому. Угловая - это только интерфейс; он никогда не взаимодействует с вашим сервером/базой данных за пределами вызовов REST. –

+0

@JoeClay извините, у меня было какое-то угловатое вещество в голове и случайно получил там тег :) –

+0

Нет проблем! Это легко сделать, когда вы впервые начинаете со всех вещей стека MEAN. –

ответ

0

Первая часть является нормальным Mongoose сохранить, в котором вы создаете новый объект из схемы. Второй способ имеет метод, определенный в схеме для обработки сохранения.

PostSchema.methods.upvote = function(cb) { 
    this.upvotes += 1; 
    this.save(cb); 
}; 

Например, если у меня уже есть сохраненный пост, и я хочу его перепроверить. Я могу иметь маршрут, как это:

router.put('/post/:id/upvote', function(req, res, next) { 
    Post.findOne({_id: req.params.id}, function (error, post) { 
    post.upvote(function(error, post) { 
     res.json(post); 
    }); 
    }); 
}); 

В простых терминах, приведенный выше код использует встроенный метод «upvote», который уже определен в схеме, так что все объекты, созданные из схемы будет иметь " upvote ", который увеличит количество upvotes. Это то же самое, как это сделать:

router.put('/post/:id/upvote', function(req, res, next) { 
    Post.findOne({_id: req.params.id}, function (error, post) { 
    post.upvotes += 1; 
    post.save(function(error, post) { 
     res.json(post); 
    }); 
    }); 
}); 

Только что она чище и экономит вам несколько нажатий клавиш.

+0

Получил! Но так лучше делать редактирование лучше иметь в схеме вместо маршрутизатора? –

+1

Никто не лучше, чем другой, только случай личных предпочтений. Но если я решит сделать изменения в методах Schema, я все сделаю так же, как и все изменения в функциях маршрутизатора. Поэтому согласованность - это ключ. Рад, что я смог помочь. –

2

Два способа на самом деле то же самое. В первом примере создается новый экземпляр Post. На этом экземпляре вызывается save, поскольку он существует на PostSchema (унаследован от Mongoose Schema).

Во втором примере мы определяем новый метод на PostSchema, поэтому при вызове this ссылается на экземпляр Post. Параметр cb - это обратный вызов, который обычно является функцией.

Посмотрите на этот пример.

router.post('/posts', function(req, res, next) { 
    var post = new Post(req.body); 

    post.save(function(err, post) { 
     if (err) { return next(err); } 
     var callback = function(err, post) { 
      console.log("Upvoted"); 
      res.json(post); 
     } 
     post.upvote(callback);   
    }); 
}); 

Здесь новое сообщение создано с одним upvote по умолчанию. Создан и сохранен новый экземпляр Post в db. После сохранения вызывается метод upvote. После того, как верхняя часть была сохранена в db, в ответ возвращается новое сообщение. Надеюсь, это поможет.

+1

спасибо за это, всегда полезно получить различную информацию. –

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