mongoose.model(' Foo',FooSchema)vs require(' ./ models / Foos')

时间:2015-09-01 02:50:31

标签: node.js mongodb mongoose

创建架构后,将其放置在models文件夹中。这样添加一行代码......

// within '/models/Foos.js'
mongoose.model( 'Foo', FooSchema ) 

...但是在节点的app.js中也添加了对此架构的引用,因此......

var mongoose = require( 'mongoose' );
require( './models/Foos' )

......但是有什么区别?为什么我们需要做后者(即在app.js中添加模式文件引用到全局mongoose对象),当我们已经在模式文件本身(即FoosSchema.js)中做了看似相似的事情时,{{ 1}}。发生了什么事?

2 个答案:

答案 0 :(得分:1)

实际上它可以只是:

var Foo = mongoose.model( 'Foo' );

在完成初始模型声明之后,它将仅使用已经附加的模式检索指定的模型,当然,至少在范围内,您已经有require mongoose

同样,你可以完全内联使用它:

mongoose.model( 'Foo' ).find({},function(err,foos) {
    // do something
});

最后,使用require为您定义的模块和mongoose.model访问器的“两个”方法通常会实现相同的目的。主要的“区别”是require是“以路径为中心”的应用程序结构。其中mongoose.model正在检查mongoose自己定义的模型数据的“注册表”,并按名称检索所需的“服务”。

因此,在很多情况下使用mongoose.model可能会被认为是“更干净”,但另一方面,require可能更多地沿着其他模块导入的逻辑而其他人习惯于风格。

这实际上归结为最适合您的编码模式和风格。虽然作为“基于名称”,但与从应用程序中的“路径”导入相比,mongoose.model样式确实使“动态”代码更容易调用所需的模型。

考虑一下:

async.each(['Foo','Bar'],function(modelName,callback) {
    mongoose.model(modelName).remove({},callback);
},function(err) { 
   //done 
});

作为注册模型不需要require的编程调用的示例。

答案 1 :(得分:0)

mongoose.model('Foo', FooSchema)行在mongoose内全局注册模型,这意味着可以通过mongoose.model('Foo')在应用程序内的任何位置获取模型。但是,仅在应用程序内Foofoos.js之后才会注册模型require。因此,您仍然需要在某处请求文件,因此行require( './models/Foos' )

编辑:使用循环来要求模型目录中的每个文件。

var normalizedPath = require('path').join(__dirname, "./models");
require("fs").readdirSync(normalizedPath).forEach(function(file) {
  require("./models/" + file);
});