gpt4 book ai didi

node.js - Node 异步执行

转载 作者:太空宇宙 更新时间:2023-11-04 00:07:47 24 4
gpt4 key购买 nike

在我的 Express 应用程序中,我正在使用 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

我可以理解 Node 在建立连接并创建数据库之前执行 app.js 中的控制台语句,但我似乎不知道如何解决这个问题。任何帮助将不胜感激。

最佳答案

正如您自己所说,mongoose.connect 需要一些时间,因此它接受一个回调函数,以便在完成后执行,您已经在使用该函数了。

在该回调函数中,您创建 acl 资源,这意味着使用 acl 变量的任何内容也必须在该回调中执行(直接或间接)。因此,在您的情况下,您必须执行以下操作:

acl.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;

ma​​in.js:

var connectACL = require('acl.js');
var express = require('express');
var app = express();

connectACL((err, acl) => {
console.log('ACL: ', acl);
});

重要的变化是 require('acl.js') 现在返回一个接受回调的函数,以便您可以安全地使用 acl创建。

您还可以看到 acl 使用一种不同类型的异步处理,称为“Promises”(.then.catch 东西)。两者都是有效的选项,但您通常会希望决定仅使用其中一个并尽快转换另一个(就像我在这里使用 .then(() => callback(null, acl)).catch 所做的那样(回调))。但是,每当处理异步函数时,您都需要其中之一,因为您必须确保代码以正确的顺序执行。

关于node.js - Node 异步执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51423705/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com