我正在做一个演示项目,我的一个路由器有一个简单但令人讨厌的问题。
对于项目ID,将其作为url参数传递。该项目为用户分配了专用视图(路由为/user/:userid/
),通用视图(例如,路由为/group/:grouid/profile
)以及用户专用但可以与通用视图实时共享数据的视图(例如。路由为/group/:groupid/:userid/
)。
我目前有一个简单的中间件授权代码,可防止未注册用户访问组或私有用户视图以查看未注册的视图。代码摘要如下:
authorizationFunctionGroups: function(req, res, next) {
console.log('in middleware authorizationFunctionGroups');
console.log('userid', req.params.userid);
if (!_.isEmpty(registers.groups) && _.get(registers.groups, req.params.groupid)) {
//console.log(registers.groups[req.params.groupid]);
console.log(registers.groups[req.params.groupid]['membersuserid']);
registers.groups[req.params.groupid]['membersuserid'].indexOf(req.params.userid) > -1 ? next() : next(new Error("userid invalid or not in the group"));
} else {
next(new Error('Invalid groupid'));
}
}
但是,当我使用以下代码从前端的某些部分调用组配置文件路由器(/group/:grouid/profile
)时:
$('#button1').click(() =>; window.location = '.../group/' + url.pathname.split('/').slice(-2)[0] + '/profile');
路由器感到困惑,将我的呼叫通过授权中间件传递并触发错误(“用户ID无效或不在组中” )。
该呼叫被拒绝,因为当frontend方法将呼叫传递给后端时,我的路由约定被卡住了,因为它无法将该呼叫的第二个参数(“配置文件”)识别为用户。
我发现解决此问题的方法是将我目前不喜欢的路由器/group/:groupid/profile
更改为/group/:groupid/profile/profile
。
我必须将上面的代码替换为:
中间件
authorizationFunctionGroups: function(req, res, next) {
console.log('in middleware authorizationFunctionGroups');
console.log('userid', req.params.userid);
if (req.params.userid == 'profile') { ///?????????
res.redirect('/group/' + req.params.groupid + '/profile/profile');
} else if (!_.isEmpty(registers.groups) && _.get(registers.groups, req.params.groupid)) {
//console.log(registers.groups[req.params.groupid]);
console.log(registers.groups[req.params.groupid]['membersuserid']);
registers.groups[req.params.groupid]['membersuserid'].indexOf(req.params.userid) > -1 ? next() : next(new Error("userid invalid or not in the group"));
} else {
next(new Error('Invalid groupid'));
}
},
前端
$('#button1').click(() =>; window.location = '.../group/' + url.pathname.split('/').slice(-2)[0] + '/profile/profile');
两个问题
很明显,我的主要问题是传统的问题。关于如何订购/命名路由器的任何建议/资源?
我试图为每个人(组/:groupid / profile)保留一个视图,而不是使用相同的数据创建单个视图。但是:这是业界常见的最佳做法吗?如果没有,哪个更合适?
谢谢您的评论。