2015-05-29 64 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

是的。我目前正試圖創建一個角度服務工廠訪問快速路線,但沒有數據我想發佈或得到,我只想表達到控制檯日誌 –