用require导入连接angular色对象

我正在用nodejs和expressjs构build一个应用程序。 对于身份validation和用户angular色,我分别使用passport和connect-roles。

我已经build立了connect-roles对象,如下所示: https : //github.com/ForbesLindesay/connect-roles

像这样:

var user = new ConnectRoles() 

这是在我的app.js. 然后我导出这样的对象,如下所示:

 exports.user = user; 

但是,如果我需要导入这个对象,我会看到一个奇怪的行为,请检查下面的代码:

 var express = require('express'); var router = express.Router(); var user = require('../app.js'); //1 console.log(user); /* GET users listing. */ router.get('/', function(req, res) { //2 console.log(user); res.send('respond with a resource'); }); module.exports = router; 

情况1中的对象是未定义的,而情况2中的情况应该是这样。基本上,我得到2个不同的对象,这取决于我在router.get函数内部还是外部。 我已经debugging了半天,但我无法弄清楚发生了什么。

问题是应该注入这个对象来提供angular色pipe理,如下所示:

 router.get('/', user.is("admin"), function(req, res) { 

当然这会给出一个错误,因为get函数对象之外的用户是未定义的。 错误是“无法调用方法是未定义的”。

你所遇到的问题很可能是循环依赖。 你的路由器文件需要你的app.js文件,你的app.js文件需要你的路由器。 这意味着你的路由器文件得到一个部分初始化的对象,这个对象只是以后填充的。最好的解决办法是将angular色分解到一个单独的模块中,然后在两个地方都要求它。 即有一个authorisation.js文件,看起来像:

 var ConnectRoles = require('connect-roles'); var user = new ConnectRoles(); // set up all the authorisation rules here module.exports = user; 

然后在app.js和路由器文件中, var user = require('./authorisation.js');

无论何时创build循环依赖关系,这都是一个普遍问题,并不是特定于连接angular色。

我无法看到user将如何在那里被undefined …但我可以build议你使用

module.exports = user

因为这会给你的对象:

 { functionList: [], failureHandler: [Function: defaultFailureHandler], async: false, userProperty: 'user' } 

而不是:

 { user: { functionList: [], failureHandler: [Function: defaultFailureHandler], async: false, userProperty: 'user' } } 

通过您目前的实施,您可以做到:

 router.get('/', user.user.is("admin"), function(req, res) { 

如果这不能解决你的问题,你可能需要提供完整的app.js。