RESTful Crud MEAN.js 路由

Posted

技术标签:

【中文标题】RESTful Crud MEAN.js 路由【英文标题】:RESTful Crud MEAN.js routing 【发布时间】:2017-02-20 19:12:01 【问题描述】:

我对 MEAN 堆栈非常陌生,我目前正在使用 mean.js 来构建我的应用程序。我目前正在研究路由在 Express 和 Angular 中的工作原理。

我的服务器路由之一:

app.route('/api/projects/:projectId')
    .get(users.requiresLogin, projects.read)
    .post(users.requiresLogin, projects.apply)
    .put(users.requiresLogin, projects.hasAuthorization, projects.update)
    .delete(users.requiresLogin, projects.hasAuthorization, projects.delete);

在向此特定路线发出任何类型的请求之前,我需要用户身份验证,并且我的 users.requireLogin 代码是:

exports.requiresLogin = function(req, res, next) 

  if (!req.isAuthenticated()) 
    return res.status(400).send(
      message: 'User is not logged in'
    );
  

  next();
;

目前对于我的客户端路由,我有

.state('projects.view', 
        url: '/:projectId',
        templateUrl: 'modules/projects/client/views/view-project.client.view.html',
        controller: 'ProjectsController',
        controllerAs: 'vm',
        resolve: 
          projectResolve: getProject
        ,
        data: 
          pageTitle: 'Project  projectResolve.name '
        

最后,客户端路由的解析是

getProject.$inject = ['$stateParams', 'ProjectsService'];

  function getProject($stateParams, ProjectsService) 

    return ProjectsService.get(
      projectId: $stateParams.projectId
    ).$promise;
  

一切都按预期工作,除非用户未通过身份验证,我想重定向他。目前,当我访问特定路线时,什么都没有发生,我只是在控制台中收到一条消息。

angular.js:12011 GET http://localhost:3000/api/projects/57f86cfc2e363838211b19c5 400(错误请求)

我想我的问题是,我如何捕捉用户未登录的情况,以便我可以将他重定向到登录页面?

【问题讨论】:

您是否收到任何关于 statusCode 400 的错误消息? 【参考方案1】:

啊,没关系。再深入一点,似乎 mean.js 会根据返回的错误代码自动处理重定向。我应该返回一个 401 重定向到登录。

angular.module('core').factory('authInterceptor', ['$q', '$injector',
  function ($q, $injector) 
    return 
      responseError: function(rejection) 
        if (!rejection.config.ignoreAuthModule) 
          switch (rejection.status) 
            case 401:
              $injector.get('$state').transitionTo('authentication.signin');
              break;
            case 403:
              $injector.get('$state').transitionTo('forbidden');
              break;
          
        
        // otherwise, default behaviour
        return $q.reject(rejection);
      
    ;
  
]);

【讨论】:

【参考方案2】:

您可以使用Express#redirect 请在使用前检查 Express 的正确版本。

exports.requiresLogin = function(req, res, next) 

    var message =  'User is not logged in';

    if (!req.isAuthenticated()) 
        res.redirect('/login?nologin=' + message);
    else
        next();
    
;

【讨论】:

以上是关于RESTful Crud MEAN.js 路由的主要内容,如果未能解决你的问题,请参考以下文章

如何安全地删除用 yo (mean.js) 构建的 CRUD 模块 [关闭]

使用 MEAN.js Restful 无会话 API 后端的 Oauth 社交登录

MEAN实体关联

Angular 和 Express 路由如何在 mean.js 应用程序中协同工作?

使用 MEAN.JS 用户授权

RESTful 设计,如何在 CRUD 等之外命名页面?