2013-06-22 94 views
0

我讀了這個鏈接http://theholmesoffice.com/mongoose-and-node-js-tutorial/ 這裏的文章有一個代碼:貓鼬ODM使用

exports.teamlist = function(gname,callback){ 


db.once('open', function(){ 
    var teamSchema = new mongoose.Schema({ 
    country: String, 
    GroupName: String 
    }); 
    var Team = db.model('Team', teamSchema); 
    Team.find({'GroupName':gname}, function (err, teams) { 
    if(err){ 
    onErr(err,callback); 
    }else{ 
    mongoose.connection.close(); 
    console.log(teams); 
    callback("",teams); 
    } 
    })// end Team.find 
});// end db.once open 
}; 

這調用db.once方法,而在其他地方使用它像這樣

var mongoose = require('mongoose') 
    ,Schema = mongoose.Schema 
    ,ObjectId = Schema.ObjectId; 

var postSchema = new Schema({ 
    thread: ObjectId, 
    date: {type: Date, default: Date.now}, 
    author: {type: String, default: 'Anon'}, 
    post: String 
}); 

module.exports = mongoose.model('Post', postSchema); 

在路由器部分使用像這樣

exports.show = (function(req, res) { 
    Thread.findOne({title: req.params.title}, function(error, thread) { 
     var posts = Post.find({thread: thread._id}, function(error, posts) { 
      res.send([{thread: thread, posts: posts}]); 
     }); 
    }) 
}); 

而在app.js中有

var mongoose = require('mongoose'); 
mongoose.connect('mongodb://localhost/norum'); 

我不明白爲什麼這兩個具有不同的方法,哪一個是最好的一個,爲什麼?誰能幫幫我嗎。我觀察到的一件事是第二種方法是最常用的方法。所以請幫助我,哪一個是更好的方法。 我知道這主要是關於在Mongodb中創建方案,所以一次方法看起來好一點。但我仍然不確定。請幫忙。

回答

1

基本上,在第一種方法 - 它顯示了你可以用貓鼬做什麼。它假定某個地方你打開了一個到數據庫的連接(大概是幾串代碼)。然後,它會監聽該事件並在稍後完成所有工作。它只是在那裏向你展示你能做什麼。

對於intance,這產生了一個貓鼬模型(它不依賴於數據庫連接被打開) - 因此,它可以被包括從容易單獨的文件,並且通常被寫爲一個模塊,因爲它是在第二種方法

var teamSchema = new mongoose.Schema({ 
    country: String, 
    GroupName: String 
    }); 
var Team = db.model('Team', teamSchema); 

稍後在第一種方法中關閉與數據庫的連接,但那不是您想要在實際應用程序中執行的操作。您有一個連接池,並用它來頻繁查詢數據庫,只有當您計劃停止應用程序運行時才需要關閉連接。

Team.find({'GroupName':gname}, function (err, teams) { 
    if(err){ 
    onErr(err,callback); 
    }else{ 
    mongoose.connection.close(); 
    console.log(teams); 
    callback("",teams); 
    } 

第一行 - 執行查找數據庫,如果沒有返回錯誤 - 你關閉連接,記錄結果,等等。

總之,要總結 - 第一種方法通常是一show-off,second - 就像它在現實世界中一樣 - 在這裏你分離邏輯,使模型可重用和包容,在那裏你有路由器邏輯

+0

謝謝..我現在明白了。真的感謝。 –

+0

我寫了一篇文章,作爲構建堆棧部分的系列文章的一部分。這裏的連接方法並不顯示最佳實踐 - 通常應該在應用程序啓動時打開連接,並在結束時關閉連接。我寫了一篇補充文章澄清了這一點:http://theholmesoffice.com/mongoose-connection-best-practice/ –