创建架构后,将其放置在models文件夹中。这样添加一行代码......
// within '/models/Foos.js'
mongoose.model( 'Foo', FooSchema )
...但是在节点的app.js中也添加了对此架构的引用,因此......
var mongoose = require( 'mongoose' );
require( './models/Foos' )
......但是有什么区别?为什么我们需要做后者(即在app.js中添加模式文件引用到全局mongoose对象),当我们已经在模式文件本身(即FoosSchema.js)中做了看似相似的事情时,{{ 1}}。发生了什么事?
答案 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')
在应用程序内的任何位置获取模型。但是,仅在应用程序内Foo
为foos.js
之后才会注册模型require
。因此,您仍然需要在某处请求文件,因此行require( './models/Foos' )
编辑:使用循环来要求模型目录中的每个文件。
var normalizedPath = require('path').join(__dirname, "./models");
require("fs").readdirSync(normalizedPath).forEach(function(file) {
require("./models/" + file);
});