3

我正在使用 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' );

但它不出口任何东西。然而,在 app. 的文件中,需要 db.js 文件,如下所示:

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

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

所以这里出现了我不明白的部分:在 /routes/index.js 文件中,您只需像这样要求 mongoose 就可以使用模型和模式

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
4

1 回答 1

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

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

至于 mongoose 如何允许您在一个文件中定义模型并在另一个文件中使用它们,它使用了一种在required. 看到这行代码

module.exports = exports = new Mongoose;

所以这意味着你得到的require('mongoose')是一个全局共享的实例,Mongoose它有状态跟踪所有定义的模型。在我看来,这有点“神奇”,但这就是它的工作原理。Mongoose如果您想避免这种模式,您也可以创建自己的实例。

于 2012-09-13T00:08:56.083 回答