2016-03-30 16 views
0

Bu tutorial numaralı telefonu izleyerek Açısal öğreniyorum. Ne anlama gelmiyorum, neden bir nesneyi kaydetmenin/düzenlemenin iki yolu var? Gerçekten açıklamıyorlar. (Index.js yönlendirici olarak)Nesneleri iki şekilde kaydetme, fark nedir?

ilk yolu:

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); 
    }); 
}); 

İkinci yol (firavunfaresi modelinde):

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

Bunların hiçbirinin Angular ile ilgisi yoktur. Açısal, sadece bir ön çerçevedir; REST çağrılarının ötesinde sunucunuzla/veritabanınızla hiçbir zaman etkileşime girmez. –

+0

@JoeClay üzgünüm, kafamda bazı Açısal şeyler var ve oraya kaza ile etiketi aldım :) –

+0

Sorun değil! Tüm MEAN yığın öğelerine ilk başladığınızda kolayca yapılabilir. –

cevap

0

ilk bölümü normal Gelincik Oluşturduğunuz hangi tasarruf olduğunu şemadan yeni bir nesne. İkincisi, kaydetmeyi işlemek için şemada tanımlanan bir yönteme sahip. Örneğin, zaten kayıtlı bir yayın var ve varsa onu almak istiyorum. Böyle bir rota olabilir: Basit bir ifadeyle

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); 
    }); 
    }); 
}); 

, kod yukarıdaki zaten Şeması tanımlanan dahili "upvote" yöntemi kullanır, böylece şemadan oluşturulan tüm nesneler "bir olacak upvote "upvotes sayısını artıracak yöntem. daha temiz ve size birkaç tuş vuruşlarını kaydeder Sadece bu

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); 
    }); 
    }); 
}); 

: Bunu yaparken aynı şeydir.

+0

Anladım! Ancak düzenlemeler yapmak daha iyi, yönlendirici yerine şemada olması daha mı iyidir? –

+1

Hiçbiri diğerinden daha iyi değildir, sadece kişisel bir tercihtir. Ancak, Schema yöntemlerinde düzenlemeler yapmaya karar verirsek, bunu her şeyi yapacağım, aynı yönlendirici işlevlerinde düzenlemeler yapmaya devam edeceğim. Yani tutarlılık anahtardır. Sevindim, yardım edebildim. –

2

İki yol aslında aynıdır. İlk örnekte, Post'un yeni bir örneği oluşturulur. save, bu örnekte, PostSchema (Mongoose Schema'dan miras alınan) üzerinde bulunduğu için çağrılır.

İkinci örnekte, PostSchema üzerinde yeni bir yöntem tanımladığımız zaman, this çağrıldığında, Post örneğini ifade eder. cb parametresi, normalde bir işlev olan bir geri aramadır.

Bu örneğe bakın.

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);   
    }); 
}); 

İşte yeni yayın varsayılan olarak tek upvote ile oluşturulur. Yeni bir Post örneği oluşturulur ve db'ye kaydedilir. Kaydettikten sonra upvote yöntemi çağrılır. Yükseltme db'ye kaydedildikten sonra, yeni gönderi yanıtta döndürülür. Bu yardımcı olur umarım.

+1

Bunun için teşekkürler, farklı anlayış elde etmek her zaman yardımcı olur. –

İlgili konular