2015-05-29 70 views
0

我正在开发一个带有mean.js样板代码的Web应用程序。最近,我通过创建一个分析模块并添加了一些路线逻辑和下面的代码,为我的应用程序(“分析”页面)添加了一个视图。了解与AngularJS结合的Express路由(使用mean.js样板)

//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/image_analysis,看到我的tools.client.view.html页面。
我的目标现在是让这个页面只对登录的用户可见。我的第一个方法是检查用户是否登录了角度路由逻辑,这对我来说已经证明是困难的。我还读到,在前端检查身份验证是非常不安全的。所以我决定检查用户是否使用Express路由登录。
这里是什么快速路由看起来像模块我的其他AngularJS的一个

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()的目的是什么?我认为这可能是一个中间件,但我不确定它的功能。

以下是我在采用快速路由时所采取的一些尝试。这些尝试在我创建的我的分析.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已经得到了巨大的帮助。

回答

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 ...

Angluar routing如何与Express路由对比: Angluar路由全部在客户端完成。这一切都是通过Javascript 更改地址栏url并显示附加到该路线的视图来实现的。

你的角度应用程序由服务器通过一个单一的(快递)航线服务 - /(主页)

如此反复,你的整个角度应用程序加载彻底在服务器端仅有1条路线, 然后角通过它自己的ui-router接管到客户端的路由。

现在看起来很明显,服务器端身份验证检查 在客户端路由之间产生干扰并不是微不足道的。

您只能使用服务器实际控制服务的路由进行服务器端身份验证。 这些大多只是你的API路线,就你而言。


尝试1

app.get('/image_analysis', function(req, res) { 
    console.log('helloworld'); 

我想,当我访问image_analysis页面,这将登录 '的HelloWorld',但它没有出现做任何事情。

确实应该有!除非..之前有一条路线,它已经服务于所有请求

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'); 
}); 

所以这就是为什么它不起作用。

+0

感谢您的回复。 ('*',function(req,res){res.send(angularApp); //你的角应用在这里服务 });' –

+0

@ DanielJacobson我明白了。你正在使用[meanjs样板](https://github.com/meanjs/mean)?并且你将'analysis.server.routes.js'存储在'/ app/routes /'中?它*应该*然后工作... – laggingreflex

+0

是的。我目前正试图创建一个角度服务工厂访问快速路线,但没有数据我想发布或得到,我只想表达到控制台日志 –