Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js mongoose.model(';Foo';,FooSchema)与require(';/models/Foos';)_Node.js_Mongodb_Mongoose - Fatal编程技术网

Node.js mongoose.model(';Foo';,FooSchema)与require(';/models/Foos';)

Node.js mongoose.model(';Foo';,FooSchema)与require(';/models/Foos';),node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,创建模式后,将其放置在models文件夹中。添加了一行代码,因此 // within '/models/Foos.js' mongoose.model( 'Foo', FooSchema ) var mongoose = require( 'mongoose' ); require( './models/Foos' ) 。。。但对该模式的引用也添加到了节点的app.js中,例如 // within '/models/Foos.js' mongoose.model( 'Foo', FooSc

创建模式后,将其放置在models文件夹中。添加了一行代码,因此

// within '/models/Foos.js'
mongoose.model( 'Foo', FooSchema ) 
var mongoose = require( 'mongoose' );
require( './models/Foos' )
。。。但对该模式的引用也添加到了节点的app.js中,例如

// within '/models/Foos.js'
mongoose.model( 'Foo', FooSchema ) 
var mongoose = require( 'mongoose' );
require( './models/Foos' )
。。。但是有什么不同呢?当我们已经通过
mongoose.model('Foo',FooSchema)
在模式文件本身(即FooSchema.js)中做了一些看似相似的事情时,为什么还要做后者(即在app.js中向全局mongoose对象添加模式文件引用)。发生了什么?

mongoose.model('Foo',FooSchema)行在
mongoose
中全局注册模型,这意味着可以通过
mongoose.model('Foo')
在应用程序中的任何位置获取模型。但是,只有在应用程序中的
foos.js
require
'd之后,才会注册模型
Foo
。因此,您仍然需要在某个地方使用该文件,因此行
require('./models/Foos')

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

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

实际上可以是:

var Foo = mongoose.model( 'Foo' );
在完成初始模型声明之后,它将仅检索指定的模型及其已附加的模式,当然,对于
mongoose
,您至少在范围内已经有了
require

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

mongoose.model( 'Foo' ).find({},function(err,foos) {
    // do something
});
最后,对于您定义的模块使用
require
mongoose.model
访问器的“两种”方法通常可以实现相同的效果。主要的“区别”在于
require
对应用程序的结构来说是“以路径为中心的”。其中as
mongoose.model
正在检查mongoose自己定义的模型数据的“注册表”,并按名称检索所需的“服务”

因此,在许多情况下,使用
mongoose.model
可能会被视为“更干净”,但另一方面
require
可能更符合其他模块导入的逻辑,其他模块导入在样式上也已习惯

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

考虑这一点:

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

作为一个程序调用的例子,对于注册的模型,它不需要
require

好的,我明白了。然而,在我看来,这似乎仍然是多余的。一旦将模式链接到mongoose,它应该能够自动计算出引用。奇怪。是的,但是您需要实际运行将模式链接到mongoose的代码。在不需要实际文件的情况下,如何运行该代码?还有其他方法可以设置它,但所有这些方法至少都需要包含schema.Hmmm的文件,也许我们只需要添加文件位置。。。然后猫鼬应该能够计算出模型。。。否?一种常见的方法是,您有一个包含所有模式的文件夹,其中每个文件也注册模型,就像您已经注册的
mongoose.model('ModelName',Schema)
一样。然后编写一个简单的for循环,它遍历相关的模型目录,只需
require
s每个文件。这样,您在该目录中创建的每个新模型文件都将自动注册到mongoose中。我将编辑我的答案,并在那里放一个例子。哦,谢谢你的“最佳实践”。但老实说,我似乎仍然无法说服自己,不要让它成为多余的。这可能是因为我缺少一些东西。。。一块拼图仍然不见了。我的意思是,在任何情况下都可能需要其中一个,而不是另一个。例如,您需要
require
文件,但不需要使用
mongoose.model
在内部向全局mongoose添加模式。谢谢您尝试回答我。我很感激。@谢天谢地您至少熟悉依赖注入和服务解析吗?一般原则是,不要明确地要求“模块”,而是要求“注册中心”按名称提供“服务”。这是我想在这里指出的主要模拟。是的,我想是的。谢谢