使用require导入connect-roles对象时出现问题

时间:2014-09-26 10:38:48

标签: node.js express passport.js

我正在使用nodejs和expressjs构建应用程序。对于身份验证和用户角色,我分别使用通行证和连接角色。

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

像这样:

var user = new ConnectRoles()

这是在我的app.js.然后我导出了这样的对象:

exports.user = user;

但是,如果我使用require导入此对象,我会看到一个奇怪的行为,请检查以下代码:

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函数内部还是外部。我已经调试了半天,但我无法弄清楚发生了什么。

问题是应注入此对象以提供如下角色管理:

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

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

2 个答案:

答案 0 :(得分:1)

您遇到的问题很可能是循环依赖。您的路由器文件需要您的app.js文件,而您的app.js文件需要您的路由器。这意味着你的路由器文件获得了一个部分初始化的对象,只是稍后填写。最好的方法是将角色分解为一个单独的模块,然后从两个地方都需要它。即有一个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');

每当您创建循环依赖项时,这是一个普遍问题,并且不是特定于连接角色。

答案 1 :(得分:0)

我无法看到user undefined在那里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) {

根据您当前的实施情况,您可以:

{{1}}

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