我正在编写一个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
。
答案 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) {
});
因此它允许比基本驱动程序更抽象的处理作为"模型"他们自己知道如何绑定到连接,或者显然绑定到您想要的连接作为可选参数。