我正在看这个使用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
实例。