用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。