我正在设计一个模块,它提供了一个构造函数,它接受一个mongo db实例作为其参数。在我的应用程序中,我试图使用mongoose测试它。由于mongoose是基于mongoDB驱动程序模块构建的,我假设有一种方法可以从mongoose模块中检索db驱动程序对象。
我有一个失败的功能,但我不确定原因。
更新
以下是我的模块中的代码
//authorizer.js
function Authorizer(mongoDBCon, userOptions){
this.db = mongoDBCon;
this.authorize = authorize;
this.assignOwner = assignOwner;
this.setUserPermission = setUserPermission;
this.setRolePermission = setRolePermission;
this.retrieveUserPermission = retrieveUserPermission;
this.setRolePermission = setRolePermission;
let defaultOptions = {
unauthorizedHandler: (next)=>{
let error = new Error('user has performed an unauthorized action');
error.status = 401;
next(error);
},
userAuthCollection: 'user_authorization',
roleAuthCollection: 'role_authorization',
}
this.options = _.assign({},defaultOptions,userOptions);
}
function setRolePermission(role, resource, permissions) {
let document = {
role: role,
resource: resource,
permissions: permissions,
};
//add the document only if the role permission is not found
let collection = this.db.collection(this.options.roleAuthCollection);
collection.findOne(document)
.then((result)=>console.log('in here')) //------> not printing :(
.catch(e=>{console.log(e)});
}
需要在另一个文件中导入/需要配置
//authorizerConfig
let mongoose = require('mongoose');
let Authorizer = require('util/authorization/authorization');
let authorizer = new Authorizer(mongoose.connection.db);
//set admin role permissions
authorizer.setRolePermission('admin', 'users', '*');
authorizer.setRolePermission('admin', 'postings', '*');
module.exports = authorizer;
连接到mongo的文件
//app.js
// Set up and connect to MongoDB:
const mongoose = require('mongoose');
mongoose.Promise = Promise;
mongoose.connect(process.env.MONGODB_URI);//MONGODB_URI=localhost:27017/house_db
我现在没有看到我希望在then()
方法中看到的日志。
答案: @Neil Lunn给了我答案。总而言之,mongoose.connection.db相当于从MongoClient.connect返回的db。另外,我遇到了错误,因为我在建立连接之前查询了数据库。
答案 0 :(得分:1)
MongoClient和底层节点驱动程序肯定支持promises。只是你没有引用正确的"数据库对象"通过你实际使用的任何方法。
作为示范:
const mongoose = require('mongoose'),
Schema = mongoose.Schema;
mongoose.Promise = global.Promise;
mongoose.set('debug',true);
const uri = 'mongodb://localhost/other', // connect to one database namespace
options = { useMongoClient: true };
function log(data) {
console.log(JSON.stringify(data,undefined,2))
}
(async function() {
try {
const conn = await mongoose.connect(uri,options);
const testDb = conn.db.db('test'); // For example, get "test" as a sibling
let result = await testDb.collection('test').find().toArray();
log(result);
} catch(e) {
console.error(e);
} finally {
mongoose.disconnect();
}
})();
那么你应该"应该"正在做的是从连接中获取"connection"对象,并从中引用db
。你很可能想要"兄弟姐妹"当前连接的db
空间,在您的特定情况下可能"admin"
用于获取"身份验证"的信息。
但是,我们在.db()
之外使用Db
Object方法来访问"名为sibling"。这特别是不异步方法,就像.collection()
不是异步一样。
从那里开始,只需要从核心驱动程序实现相应对象的本地其他方法。
答案 1 :(得分:1)
请注意,这似乎已经有所改变,在v5中,我可以这样访问数据库:
const res = await mongoose.connect(...);
const { db } = mongoose.connection;
const result = await db.collection('test').find().toArray();
答案 2 :(得分:0)
使用connection对象检索MongoDB驱动程序实例。
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost:27017/testdb', function (err){
if (err) throw err;
let db = mongoose.connection.db; // <-- This is your MongoDB driver instance.
});