我正在使用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函数对象之外的用户是未定义的。错误是“无法调用方法未定义”。
答案 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 。