在ExpressJS上使用mongoose运行'node_acl'

时间:2014-04-03 03:48:11

标签: node.js mongodb express mongoose acl

我正在ExpressJS上构建一个应用程序(类似于博客)。我正在使用mongoose与MongoDB一起工作。

当我不得不在各种ACL模块之间进行选择时,我决定继续使用 node_acl。令我困惑的是它使用的是mongodb模块而不是mongoose。

根据ACL GitHub上的文档,必须以这种方式使用它:

// Or Using the mongodb backend
acl = new acl(new acl.mongodbBackend(dbInstance, prefix));

如果我使用mongoose,db的实例是什么?

我使用类似的东西: Account = mongoose.model('Account',new Schema({...}));

3 个答案:

答案 0 :(得分:11)

我认为你正在寻找这个:

http://mongoosejs.com/docs/api.html#connection_Connection-db

示例(未测试):

var mongoose = require('mongoose'),
    acl = require('acl');

acl = new acl(new acl.mongodbBackend(mongoose.connection.db, 'acl_'));

(这当然是假设你已经使用mongoose.connect()在其他地方初始化了Mongoose。)

答案 1 :(得分:7)

我最近碰巧也遇到过这个问题。我在stackoverflow上尝试了很多解决方案但是徒劳无功。最后我找到了问题的原因。只想分享我解决这个问题的经验。通常人们将db config和acl config分开,从而导致此问题。

问题的根源是node.js的本机功能 - 异步。如果您尝试使用以下方式记录连接状态:

console.log(mongoose.connection.readyState);

您将在db.js中找到它,它是1(已连接);在你的acl.js中,如果你没有在确保mongodb已连接的正确块中制作acl,它将是2(连接)。

如果您按照投票最多和最新的答案,您的代码可能如下所示:

var acl = require('acl');
var mongoose = require('../model/db');
mongoose.connection.on('connected', function(error){
    if (error) throw error;   
    //you must set up the db when mongoose is connected or your will not be able to write any document into it
    acl = new acl(new acl.mongodbBackend(mongoose.connection.db, 'acl_'));

});

然后您可能想要设置权限和角色。但请记住在已建立与mongodb的连接的块中进行这些操作。所以最后你的代码应该是这样的:

var acl = require('acl');
var mongoose = require('../model/db');
mongoose.connection.on('connected', function(error){
    if (error) throw error;   
    //you must set up the db when mongoose is connected or your will not be able to write any document into it
    acl = new acl(new acl.mongodbBackend(mongoose.connection.db, 'acl_'));

    //Do acl.allow('role', ['resources'], ['actions'] here
    initACLPermissions();
    //Do acl.addUserRolss('id', 'role') here
    initACLRoles();

});

答案 2 :(得分:0)

好的,所以回答bncc关于不工作的评论。

在我的安装脚本中创建初始acl数据库时,我必须确保在尝试写入之前mongoose已经打开了连接。 通常这不是应用程序的问题,但在这种情况下,请在db.connection.success中包装所有acl命令

// Lets open database
var cfgDB = require('../config/database')
var acl = require('acl')
var mongoose = require('mongoose')
var dbconnection = mongoose.connect(cfgDB.mongoUrl, function(err) {
    if(err) console.log('MongoDb: Connection error: ' + err);
})

mongoose.connection.on('open', function (ref) {
    console.log('Connected to mongo server.');
    //var dbconnection = mongoose.connect('mongodb://localhost/acl-test', {});
    console.log("Lets do this to " + dbconnection.connection.db)
    acl = new acl(new acl.mongodbBackend(dbconnection.connection.db, "acl_"));

// initialize acl system storing data in the redis backend
//acl = new acl(new acl.mongodbBackend(dbconnection, "acl_"));

    /* now assign permissions to roles */

// allow guests to view posts
    acl.allow("guest", "/index", "view");

// allow registered users to view and create posts
//acl.allow("registered users", "post", ["view", "create"]);

// allow administrators to perform any action on posts
//
    acl.allow("administrator", "/", "*");
});
mongoose.connection.on('error', function (err) {
    console.log('Could not connect to mongo server!');
    console.log(err);
});