我正在编写一个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

最佳答案

一般来说,您不这样做。 Mongoose 的思维方式与原始形式的 native 驱动程序有所不同,并且有很多东西在幕后提供帮助,使事情更无缝地工作,而无需深入研究血腥的细节。

因此,基本方法是定义“模式”和“模型”时,它们将绑定(bind)到默认连接实例。除非您有特定的理由绑定(bind)到另一个连接,否则应遵循以下步骤:

因此,您将拥有一个架构和模型定义:

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

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

如果“集合”部分是可选的,否则第一个参数中的“模型”名称将置于标准规则中,通常为小写和复数形式。

然后在其他代码 list 中,使用require将其插入:
var Model = require('./models/mymodel.js');

并在 Mongoose 允许的情况下使用模型对象:
Model.find({ "field": "name"}, function(err,models) {

});

因此,与“基本”驱动程序相比,它允许进行更多的抽象处理,因为“模型”本身知道如何绑定(bind)到连接,或者以其他方式显式绑定(bind)到想要的连接作为可选参数。

关于node.js - 将 Mongoose 连接传递给模块,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24474386/

10-16 21:01