以两种方式保存对象,有什么区别?

时间:2016-03-30 13:52:53

标签: javascript node.js mongodb mongoose

我按照tutorial学习Angular。不,我没有得到的是为什么有两种方法来保存/编辑对象?他们没有真正解释它。

第一种方式(在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);

2 个答案:

答案 0 :(得分: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的新实例并将其保存在数据库中。保存后,调用upvote方法。将upvote保存在db中后,将在响应中返回新帖子。 希望这会有所帮助。

答案 1 :(得分: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);
    });
  });
});

简单来说,上面的代码使用了已经在Schema中定义的内置“upvote”方法,因此从Schema创建的所有对象都将具有“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);
    });
  });
});

只是它更干净,为您节省了一些按键。