在我的快速应用中,我正在使用node_acl
实施ACL我的acl.js看起来像:
var mongoose = require('mongoose'),
node_acl = require('acl'),
acl;
mongoose.connect('mongodb://127.0.0.1:27017/aclExample', function _mongo_connected(){
var mongoBackend = new node_acl.mongodbBackend(mongoose.connection.db, 'acl_');
acl = new node_acl(mongoBackend);
console.log("ACL: ",acl);
});
set_roles();
function set_roles() {
//set permissions for roles
acl.allow([
{
roles: 'a', //roles
allows: [
{resources: '/fe', permissions: ['put', 'delete']},
] //permissions
},
{
roles: 'b',
allows: [
{resources: '/fe/api', permissions: 'post'}
]
},
{
roles: 'c',
allows: [
{resources: '/', permissions: ['post', 'put']}
]
},
{
roles: 'd',
allows: [
{resources:'/fe', permissions: ['get', 'post']}
]
}
]);
acl.addUserRoles(420, 'b').then( ()=> console.log('added user'))
.catch(err => console.error(err));
acl.addUserRoles(520, 'a').then( ()=> console.log('added user'))
.catch(err => console.error(err));
//acl.isAllowed(userId, reso, pem);
}
module.exports = acl;
和我的app.js:
var acl = require('@root/fe-server/middlewares/fe.middleware.acl.js');
var express = require('express');
var app = express();
console.log("ACL: ",acl);
我得到的输出看起来像这样:
ACL: undefined
added user
added user
我可以理解,在建立连接和创建db之前,节点会在app.js中执行console语句,但是我似乎无法弄清楚该如何解决。 任何帮助将不胜感激。
答案 0 :(得分:1)
正如您自己说的那样,from subprocess import PIPE , Popen
p1 = Popen(["cat", "SomePythonScript.py"], stdout=PIPE)
p2 = Popen(["ssh", "remote_machine", "cat - | python"], stdin=p1.stdout, stdout=PIPE)
p1.stdout.close()
output = p2.communicate()[0]
需要花费一些时间,因此它接受了一个回调函数,一旦完成,您就已经在使用它了。
在该回调函数中,您创建了mongoose.connect
资源,这意味着使用acl
变量的任何内容也必须从该回调中执行(直接或间接)。因此,在您的情况下,您将必须执行以下操作:
acl.js
acl
main.js :
const mongoose = require('mongoose');
const node_acl = require('acl');
const connect = (callback) => {
mongoose.connect('mongodb://127.0.0.1:27017/aclExample', (err) => {
if (err) return callback(err);
const mongoBackend = new node_acl.mongodbBackend(mongoose.connection.db, 'acl_');
const acl = new node_acl(mongoBackend);
set_roles(acl).then(() => callback(null, acl)).catch(callback);
});
};
const set_roles = (acl) => {
acl.allow([ /* stuff */ ]);
return Promise.all([
acl.addUserRoles(420, 'b').then(() => console.log('added user b')),
acl.addUserRoles(520, 'a').then(() => console.log('added user a')),
])
};
module.exports = connect;
重要的更改是var connectACL = require('acl.js');
var express = require('express');
var app = express();
connectACL((err, acl) => {
console.log('ACL: ', acl);
});
现在返回了一个接受回调的函数,因此您可以在创建require('acl.js')
之后安全地使用它。
您还可以看到acl
使用了另一种类型的异步处理方式,即“承诺”(acl
和.then
东西)。两者都是有效的选项,但是您通常希望决定仅使用一个,然后尽快转换另一个(就像我在这里使用.catch
一样)。
但是,在处理异步函数时,您将需要其中之一,因为您已确保代码以正确的顺序执行。