节点异步执行

时间:2018-07-19 13:17:26

标签: node.js mongodb express acl

在我的快速应用中,我正在使用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语句,但是我似乎无法弄清楚该如何解决。 任何帮助将不胜感激。

1 个答案:

答案 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一样)。 但是,在处理异步函数时,您将需要其中之一,因为您已确保代码以正确的顺序执行。