当所需的文件不导出任何内容时,require() 会做什么?设置猫鼬+快递的正确方法是什么?



我正在看这个使用express.js+mongoose(在github上:https://github.com/dreamerslab/express-todo-example)。在db.js文件中,它定义了模式并连接到mongodb:

var mongoose = require( 'mongoose' );
var Schema   = mongoose.Schema;
var Todo = new Schema({
user_id    : String,
content    : String,
updated_at : Date
});
mongoose.model( 'Todo', Todo );
mongoose.connect( 'mongodb://localhost/express-todo' );

但它不出口任何东西。但在应用程序中s文件db.js文件的要求如下:

// mongoose setup
require( './db' );

而不将其分配给任何变量。

因此,我不理解的部分出现了:在/routes/index.js文件中,只需要求像这样的猫鼬,就可以使用模型和模式

var mongoose = require( 'mongoose' );
var Todo     = mongoose.model( 'Todo' );
Todo.find(...)
...

那么,index.js是如何计算Todo模型中的内容的呢?因为mongoose实例不是传递给它的,而是它所必需的

此外,如果我想将我的模式分离成不同的文件,例如todo.js、user.js等,那么设置结构的正确方法是什么?在连接之前,我应该只需要db.js中的模式文件吗?

提前感谢!

待办事项应用程序的结构:

todo
|-- node_modules
|   |-- ejs
|   |-- express
|   `-- mongoose
|
|-- public
|   |-- images
|   |-- javascripts
|   `-- stylesheets
|       |-- style.css
|
|-- routes
|   `-- index.js
|
|-- views
|   |-- index.ejs
|   `-- layout.ejs
|
|-- .gitignore
|
|-- app.js
|
`-- package.json
// mongoose setup
require( './db' );

该代码只会导致db.js模块运行,这就是本例所需的全部内容。大多数模块都会导出一些东西,但在这种情况下,只需要运行顶层代码,就不需要导出任何东西。

至于mongoose如何允许您在一个文件中定义模型并在另一个文件使用它们,它使用了一种在required时返回单例实例的复杂方法。请参阅这行代码:

module.exports = exports = new Mongoose;

因此,这意味着您从require('mongoose')得到的是Mongoose的全局共享实例,它具有对所有定义的模型的状态跟踪。在我看来,这有点"神奇",但它就是这样运作的。如果您想避免这种模式,您也可以创建自己的Mongoose实例。

最新更新