【问题标题】:Exporting a mongoose database module导出 mongoose 数据库模块
【发布时间】:2012-11-20 01:13:18
【问题描述】:

我需要导出我的 mongoose 数据库模块,这样我就可以使用程序中每个模块中定义的模型。

例如,我的 database.js 模块看起来像这样:

var mongoose = require('mongoose'),
    db = mongoose.createConnection('mongodb://localhost/newdb'),
    Schema = mongoose.Schema;

db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function callback () {
    console.log("Connected to database newdb");

    var dynamicUserItemSchema = new mongoose.Schema({
      userID: Number,
      rank:  Number,
    });

    var staticUserItemSchema = new mongoose.Schema({
        _id: Schema.Types.Mixed,
        type: Schema.Types.Mixed,
    });

    var DynamicUserItem = db.model('DynamicUserItem', dynamicUserItemSchema);
    var StaticUserItem = db.model('StaticUserItem', staticUserItemSchema);

});

我希望能够将var db = require('../my_modules/database'); 添加到我的程序的任何其他模块中 - 所以我将能够使用这样的模型:

db.DynamicUserItem.find();item = new db.DynamicUserItem({});

是否可以使用“导出”或“模块导出”来做到这一点?谢谢。

【问题讨论】:

    标签: javascript node.js mongodb express mongoose


    【解决方案1】:

    我通常不使用erroropen 事件并按照mongoosejs 中的示例创建与我的数据库的连接。使用示例,您可以执行以下操作。

    db.js

    var mongoose = require('mongoose');
    var db = mongoose.createConnection('localhost', 'test');
    
    var schema = mongoose.Schema({ name: 'string' });
    var Cat = db.model('Cat', schema);
    
    module.exports = Cat; // this is what you want
    

    然后在您的 app.js 中您可以执行类似的操作

    var Cat = require('db');
    
    var peter = new Cat();
    

    希望有帮助!

    【讨论】:

    • 感谢 zeMirco。所以说每个模型都在一个不同的文件中?
    • 这取决于你。您可以从一个文件中导出多个模型(例如 exports.Cat = Catexports.Dog = Dog),或者每个文件只使用一个模型。对于后者,我会为数据库连接参数使用全局配置文件。
    【解决方案2】:

    您可以使用导出来定义其他地方可能需要的模块:

    ./models/list.js

    var ListSchema = new Schema({
        name                : { type: String, required: true, trim: true }
        , description   : { type: String, trim: true }
    });
    
    module.exports = db.model('List', ListSchema);
    

    ./routes/list.js

    var list = module.exports = {};
    
    var List = require('../models/list');
    
    list.get = function(req, res){
            List.find({ user: user._id }).exec(function(err, lists){
                res.render('lists', {
                    lists: lists,
                });
            });
        });
    };
    

    ./app.js

    app.get('lists', routes.lists.get);
    

    【讨论】:

    • db - 它在哪里定义?是全球性的吗?
    【解决方案3】:

    如果您使用的是 express,那么我会将模型放在 app.settings 中。您可以在配置时执行以下操作:

    app.configure(function() {
      app.set('db', {
          'main'     : db
        , 'users'    : db.model('User')
      })
    })
    

    然后您就可以使用req.app.settings.db.users 之类的模型,或者您可以创建一种方法以其他方式在您想要的文件中获取db 变量。

    这个答案不是一个完整的例子,但是看看我的入门项目,它以相对容易使用的方式设置了 express 和 mongoose:https://github.com/mathrawka/node-express-starter

    【讨论】:

    • 我认为这不会比标准 node/commonjs 模块系统增加任何价值,并且会无缘无故地将您的代码耦合到 express 的配置系统。只需使用 commonjs 模块接吻。
    • 是的,它将它与 express 结合起来,使访问像猫鼬模型这样的常见事物变得更加容易。对于生产应用程序,有时简单的方法不够灵活。
    【解决方案4】:

    作为已接受答案的补充,如果您想导出多个模块,您可以这样做:

    在 db.js 中:

    var my_schemas = {'Cat' : Cat, 'Dog': Dog};
    module.exports = my_schemas;
    

    然后在app.js中:

    var schemas = require('db');
    var Cat = schemas.Cat;
    var Dog = schemas.Dog;
    Cat.find({}).exec({...});
    

    【讨论】:

      猜你喜欢
      • 2017-12-10
      • 2021-12-20
      • 2022-01-15
      • 1970-01-01
      • 2017-06-07
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      相关资源
      最近更新 更多