2013-06-22 97 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/ –