理解Express路由与AngularJS一起使用(使用mean.js样板)

时间:2015-05-29 14:40:36

标签: javascript angularjs node.js express

我正在使用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是一个巨大的帮助。

1 个答案:

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

这就是为什么它不起作用的原因。