我按照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);
答案 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);
});
});
});
只是它更干净,为您节省了一些按键。