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