我正在使用mean.js样板代码开发一个Web应用程序。最近,我通过创建分析模块并使用以下代码添加了一些路由逻辑,为我的应用程序(“分析”页面)添加了一个视图。
//Setting up route
angular.module('analysis').config(['$stateProvider',
function($stateProvider) {
// Projects state routing
$stateProvider.
state('imageAnalysis', {
url: '/image_analysis',
templateUrl: 'modules/analysis/views/tools.client.view.html'
});
}
]);
这很有用,我可以访问homepage.com/image_analysis并查看我的tools.client.view.html页面。
我的目标现在只有登录用户才能看到此页面。我的第一个方法是检查用户是否登录了角度路由逻辑,这已被证明对我来说很难。我还读到前端的检查身份验证非常不安全。所以我决定检查用户是否使用Express路由登录。
以下是我的其他AngularJS模块的Express路由的示例
module.exports = function(app) {
var users = require('../../app/controllers/users.server.controller');
var projects = require('../../app/controllers/projects.server.controller');
// Projects Routes
app.route('/projects')
.get(users.requiresLogin, projects.list)
.post(users.requiresLogin, projects.create);
app.route('/projects/:projectId')
.get(users.requiresLogin, projects.read)
.put(users.requiresLogin, projects.hasAuthorization, projects.update)
.delete(users.requiresLogin, projects.hasAuthorization, projects.delete);
// Finish by binding the Project middleware
app.param('projectId', projects.projectByID);
};
请注意users.requiresLogin函数,该函数检查用户是否已登录,如果不是,则将用户重定向到登录页面。我想利用这个功能。在样板代码中我不太明白的一些事情是 app.route()的目的是什么?我认为这可能是一个中间件,但我不确定它是做什么的。
以下是我在使用快速路由时所采取的一些尝试。这些尝试都在我创建的analy.server.routes.js文件中 尝试1
module.exports = function(app) {
var users = require('../../app/controllers/users.server.controller');
// analysis routes
app.get('/image_analysis', function(req, res) {
console.log('helloworld');
console.log('helloworld');
console.log('helloworld');
console.log('helloworld');
console.log('helloworld');
console.log('helloworld');
});
};
我认为当我访问image_analysis页面时会记录'helloworld',但它似乎没有做任何事情。
尝试2
module.exports = function(app) {
var users = require('../../app/controllers/users.server.controller');
// analysis routes
app.route('/image_analysis')
.get(users.requiresLogin);
};
基于其他代码,我认为这可能需要登录分析页面。但它没有做任何事情。
任何帮助将不胜感激!谢谢大家,我正在努力掌握快速路由,而stackoverflow是一个巨大的帮助。
答案 0 :(得分:1)
我没有解决方案,或者至少在此刻我没想到。 但是,我可以向您解释事情是如何运作的,以及为什么解决方案可能不是微不足道的。
的目的是什么?
app.route()
这定义了您的路线。
app.route('/projects/:projectId')
.get(users.requiresLogin, projects.read)
.put(users.requiresLogin, projects.hasAuthorization, projects.update)
.delete(users.requiresLogin, projects.hasAuthorization, projects.delete);
当客户端请求类似以下某个
之类的URL时,该代码的作用是什么GET /projects/5562ff08de4f70180bba3083
PUT /projects/5562ff08de4f70180bba3083
DELETE /projects/5562ff08de4f70180bba3083
它首先执行中间件函数users.requiresLogin
,
定义为在所有方法中都很常见(.get
.put
.delete
)
然后他们各自的中间件按此顺序
projects.read
| projects.hasAuthorization
...
与Express路由相比,Angluar routing的工作原理如下: Angluar路由都是在客户端完成的。这一切都是通过Javascript实现的 更改地址栏网址并显示附加到该路线的视图。
您的Angular应用程序由服务器通过单一(快速)路线提供 - /
(主页)
再次,您的整个Angular应用程序只在服务器端加载了一条路径, 然后Angular通过它自己的ui-router接管路由到客户端。
现在必须开始显而易见的是,进行服务器端身份验证检查并非易事 干扰客户端路由。
您只能让服务器端身份验证与服务器实际控制服务的路由一起使用。 在您的情况下,这些只是您的API路线。
尝试1
app.get('/image_analysis', function(req, res) { console.log('helloworld');
我认为这会记录'helloworld'当我访问image_analysis页面时,它似乎没有做任何事情。
确实应该有!除非......在它之前有一条已经服务于所有请求的路线
app.get('*', function(req, res) {
res.send(angularApp); // your angular app is served here
});
// No request would *need* to go beyond past this point
// because it already got served above
app.get('/image_analysis', function(req, res) {
// so this isn't reached.
console.log('helloworld');
});
这就是为什么它不起作用的原因。