将mongoose连接传递给模块

时间:2014-06-29 08:27:45

标签: node.js mongodb mongoose

我正在编写一个Node模块,可以对MongoDB执行查询。

我的模块应该将MongoDB连接作为参数(当我使用new MyModule(db)初始化时)并在其中使用它。

我使用的是没有任何NPM模块的标准MongoDB,而且我在我的db变量中传递了与MongoDB的连接。现在我切换到Mongoose,我找不到将Mongoose连接传递给模块的方法。

我不想在我的模块中初始化Mongoose连接,因为我想与我的测试和其他模块共享它。

我该怎么办?我已经尝试将mongoose传递给我的模块,但它不起作用“不是一个函数”。

修改

在阅读了@Neil Lunn的回复后,我发布了我的模块样本:

(function () {
    "use strict";

    /**
     *  various requires
     */

    function TopicManager(dbURI) {
        if (!(this instanceof TopicManager)) { return new TopicManager(dbURI); }
        mongoose.connect(dbURI);
    }

    TopicManager.prototype.save = function (topics, done) {

        var Topic = new mongoose.schema(
            {
                title: { type: String },
                slug: { type: String, index: { unique: true } }
            },
            {collection : "topics"}
        );

        /**
         * Use monguurl on "slug"
         */

        mongoose.update(
            {title: topic.title},
            {upsert: true},
            function (err, numberAffected, raw) {
                if (err) { return done(err); }
                return done(null, raw);
            }
        );    
    };

    module.exports = TopicManager;
})();

它不起作用,因为当我使用它时,我会undefined is not a function运行new mongoose

2 个答案:

答案 0 :(得分:3)

您可以创建默认Mongoose connection

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost:27017/test');

var db = mongoose.connection;

如果要打开多个连接,可以使用createConnection

var dbconnection = mongoose.createConnection ('uri,uri');

然后,可以使用此连接对象创建/检索仅限于此连接的模型。

Mongoose连接对象有多个附加处理程序的事件。您应该查看documentation以获取可以使用的处理程序的完整列表。

为了帮助您入门,基本方法是:

// log connection errors
db.on('error', console.error.bind(console, 'connection error:'));

// wait for opening the connection
db.once('open', function () {
   // do something once connection to the MongoDB is open
});

如果使用createConnection打开连接,则需要在创建模型时使用它:

// dbconnection is created using createConnection
var MyModel = dbconnection.model('MyModel', MyModelSchema);

答案 1 :(得分:3)

一般来说,你不这样做。猫鼬的心态与使用本地驱动程序的原始形式略有不同,并且有很多东西可以帮助我们更好地工作,而不会潜入血腥的细节。

所以基本的方法是定义你的"架构"和" models",这些绑定到默认连接实例。除非您有特定原因要绑定到另一个连接,否则这应该是您应该遵循的:

所以你会有一个Schema和模型定义:

var mySchema = new Schema({
    "name": String
});

module.exports = mongoose.model( "Model", mySchema, "collection" )

"集合"部分是可选的,否则"模型"第一个参数中的name被赋予标准规则,通常是小写和复数。

然后在您的其他代码清单中,使用require:

将其拉入
var Model = require('./models/mymodel.js');

将你的模型对象用作mongoose许可证:

Model.find({ "field": "name"}, function(err,models) {

});

因此它允许比基本驱动程序更抽象的处理作为"模型"他们自己知道如何绑定到连接,或者显然绑定到您想要的连接作为可选参数。