6

我有以下 Node.js 目录结构。

|--app/
   |--app.js
   |--routers/
      |--index.js/
   |--models/
      |--schemas.js
      |--post.js

app.js中,有这样一行mongoose.connect('mongodb://localhost/' + config.DB_NAME);。在schema.js 中

var mongoose = require('mongoose')
    , Schema = mongoose.Schema
    , ObjectId = Schema.ObjectId;

var PostSchema = new Schema({
    title: String
    , author: String
    , body: String
    , creataAt: { 
        type: Date
        , default: Date.now
    }
});

// other schemas goes here

module.exports.PostSchema = PostSchema;

post.js 中

var mongoose = require('mongoose')
    , PostSchema = require('./schemas').PostSchema
    , PostModel = mongoose.model('Post', PostSchema);

module.exports = PostModel;

index.js中,可能会有这样一行:var PostModel = require('../models/post');. 上面提到的所有文件都需要mongooseschemas.js的目的是帮助程序员在单个文件中掌握数据库的模式。但是,我想知道这个工具是否会导致冗余并导致更多开销,因为我到处都需要猫鼬。我应该把它作为一个论点传递吗?

4

2 回答 2

9

如果您只担心性能,则不必担心。根据http://nodejs.org/docs/latest/api/modules.html#modules_caching

缓存

模块在第一次加载后被缓存。这意味着(除其他外)每次调用都require('foo')将返回完全相同的对象,如果它会解析为同一个文件。

多次调用require('foo')可能不会导致模块代码被多次执行。这是一个重要的特点。有了它,可以返回“部分完成”的对象,从而允许加载传递依赖项,即使它们会导致循环。

如果你想让一个模块多次执行代码,那么导出一个函数,然后调用那个函数。

所以,你实际上并不是requiring每次都是 Mongoose。相反,每次在第一次之后,都会返回缓存的 Mongoose 模块。

于 2012-06-28T02:21:29.977 回答
0

当需要链接模块中的猫鼬时,您还需要注意。在 mongoose 的情况下,您通常依靠单例模式来连接 mongodb,而缓存机制可能会妨碍模块化。我可能做错了什么,但我在那里详细说明了问题:https ://stackoverflow.com/questions/16687619/node-js-require-do-not-behave-as-expected-when-using-linked-packages

于 2013-07-29T15:03:34.673 回答