如何构建具有可靠后端的完全可扩展的SPA

时间:2013-08-29 19:40:37

标签: javascript node.js angularjs http-authentication

过去几周我一直在努力使用Angular,Node,TDD,Heroku,Amazon S3等。试图更好地了解如何构建具有可靠后端的完全可扩展的SPA,使用grunt, bower,还没有使用Jasmine在TDD中浸泡我的脚趾,虽然我知道如何通过Karma进行测试,这可能是我的下一步。

有一件事是肯定的:这是很多信息


关于使用所有这些技术的问题/理由。

首先,我玩

并阅读了许多帖子等。

我发现NG Boilerplate是最符合逻辑的结构(就我对这些事情的理解而言)。

作为一个演示项目(从一些非常小的东西演变而来)我想使用以下方法制作单页CRUD应用程序:

  • NodeJS作为后端
  • 表达为网络应用框架
  • NG Boilerplate作为客户
  • 部署到Heroku的应用
  • MongoDB for DB
  • 用于动态存储的Amazon S3

现在我想使用Angular-Apps的(https://github.com/angular-app/angular-app)服务器作为我的NGBoilerplate kickstarter的后端

我想知道如何:


长话短说,没有我问过很多问题,有人可以请详细描述这样一个应用的工作流程吗?获取会话,登录,访问编辑内容,将快速路线绑定到角度路线(例如,管理员只能访问X路线)等。##

我脑子里有一个很大的模糊:)。

2 个答案:

答案 0 :(得分:4)

在过去的几个月里,我对这些问题和问题进行了很多讨论,并得出以下结论:

出于我的目的,我需要一个几乎完全依赖Angular的应用程序,没有单独的后端,而现在的后端应该来自Angular。

为什么呢?因为我想把所有的鸡蛋都放在一个篮子里,所以我不想在很多不同的部位配置很多东西。

作为我项目的基础,我最终使用ng-boilerplate作为样板:),对开发过程,Grunt任务等进行了一些更改,这是每个人都要弄清楚的,具体取决于每个特定的项目。 / p>

嗯,我要在这里触及的主要问题是,对于Angular中的真正后端,我们需要安全路由和安全持久性方法,数据库。

对于应用程序,我利用了ng-boilerplate的模块化和依赖感知结构,我认为它非常适合Angular应用程序。

无论如何,我要从上到下(最终产品明智,如上所述构建环境,这取决于你,但是ng-boilerplate很棒),我们走了。

  1. 在上层,我们有实际的Angular应用程序,按我们想要的方式制作
  2. 服务器容器,是一个NodeJS服务器,带有快速和其他模块,可以在不同的浏览器和设备上对路由进行PARTIAL处理(在我的应用程序中,我制作了HTML5路由,通过快速增强,.htaccess类似设置,只要有部分URL应该重定向到索引,其中Angular将读取请求的路径并将zapp引导到该位置)
  3. 就我而言,整个事情都在Heroku上运行,在Node.JS应用程序上,如果你愿意,可以在那里安装其他几个东西。
  4. 现在,为了持久性,要具有身份验证和安全性,而不是依赖后端,我使用的是firebase(https://www.firebase.com/),那里有一些很棒的教程可以帮助你实现真正的持久性你的Angular APP,当你登录时有路由,当你登录时访问数据库中的自定义表/对象等。这是真正的交易。

    如果您不想依赖OAuth可能的网站登录(Facebook,github,角色或推特)并想要自定义电子邮件和地址,您可以直接使用Firebase,创建帐户并删除它们等。< / p>

    FIREBASE Angular Backend。

    因此,Firebase就像他们在网站上所说的那样,是一个功能强大的API,可以实时存储和同步数据。

    我不知道如何处理这个问题,所以我要创建一个Firebase数据库。一旦我们创建它,在后端我们有几个选项,其中一个是安全性。

    { "rules": { ".read": true, ".write": "auth != null" } }

    在此,如果我们阅读https://www.firebase.com/docs/security/security-rules.html上的文档,我们将了解到我们可以为每个“表格”添加规则。在我们的数据库中,所以我们可以拥有3个受保护的'table'对象和一些不受保护的对象。

    我们可以根据不同的规则保护每个用户的表格,如果登录或不登录,我们也有规则的继承等,请在那里阅读文档,这真的是一个很好的阅读。

    现在,要使这些规则生效,我们需要启用Firebase简单登录,并从Facebook,Twitter,Github,Persona,电子邮件和密码以及匿名中选择所需的登录方式。

    对于真正的应用程序,我们还需要将信息也以匿名(用户会话等)的形式写入DB,并且还要记录(使用上述任一选项)来存储和读取信息。

    我,我想快速简单地进行Facebook身份验证,阅读那里的文档,我制作了一个快速的Facebook应用程序,在Facebook上的应用程序设置中,我正在使用Firebase的后端https://www.dropbox.com/s/xcd4b8tty1nlbm5/Screenshot%202014-01-22%2013.51.26.png

    这提供了登录Facebook的临时链接,并且可以访问“表格”,如果规则为auth !=null,则会锁定这些“表格”。


    现在,进入Angular后端。

    Firebase为我们的应用程序提供了一个库,还为Angular提供了一个SimpleLogin库,一个名为AngularFire的工厂服务。

    就我而言,我使用连接到我的数据库的使用方法创建了本地firebaseService:

    angular.module('firebaseService', ['firebase'])
      .service('firebaseService', function ($firebase, $rootScope) {
    
        //Input data in Firebase
        var URL = "https://glowing-fire-xxxx.firebaseio.com";
        var tellFirebase = function(ID, JSON) {
          users = $firebase(new Firebase(URL + '/' + ID));
          users.details = JSON;
          users.$save('details');
        };
    
        return {
          addUser: function(ID, JSON) {
            tellFirebase(ID, JSON);
            if ($rootScope.debugStatus === true) {
              console.log('Firebase Service .addUSer Called');
            }
          },
          getUser: function(ID) {
            if ($rootScope.debugStatus === true) {
              console.log('Firebase Service .getUser Called');
            }
          }
        };
      }) 
    

    从这里开始我们的READ / WRITE,在控制器的页面上我有这个:

    值得注意的是,我有一个中间件服务(storageManagement),我在Firebase和MongoDB之间切换,以避免混淆。

    .controller( ‘SomeCtrl', function SomeController( $scope, storageManagement, $firebase, $firebaseSimpleLogin ) { 
         /*===========================
         * ==== FIREBASE LOGIN
         * ===========================*/
    
        var URL = "https://glowing-fire-XXXXX.firebaseio.com";
        var users = new Firebase(URL);
    
        $scope.auth = $firebaseSimpleLogin(users, function(error, user){});
    
        if ($scope.auth.user == null) {
          //$scope.auth.$login('facebook');
        }
    
        console.log($scope.auth);
    
        //$scope.auth.$logout('facebook');
    
    
        $scope.doLogin = function() {
          console.log($scope.facebookemail);
          console.log($scope.facebookpassword);
    
          $scope.auth.$login('facebook');
    
          $scope.$on("$firebaseSimpleLogin:login", function(evt, user) {
            storageManagement.runFirebase();
          });
    
          /* example of logging in while asking access to permissions like email, user_list, friends_list etc.
           * auth.$login('facebook', {
           rememberMe: true,
           scope: 'email,user_likes'
           });*/
        };
        $scope.doLogout = function() {
          $scope.auth.$logout();
        };
    });
    

    我将$ firebase服务添加到我的控制器,以及$ firebaseSimpleLogin服务。

    这里显示范围两个按钮,登录/注销,从Facebook弹出OAuth窗口,电子邮件/密码设置你不需要经历这个我认为,为了充分理解请阅读firebase上的完整文档。

    所以,一旦我们被记录,我们就可以访问规则中描述的表格,如果我们选择电子邮件/密码,实际上即使是Facebook或其他方法,我们也可以为某些IDENTITIES分配某些规则,所以你可以拥有一个ADMIN表,在那里你可以保存在页面加载时获得READ的设置以应用你想要的任何内容。

    现在,通过路线,我们可以检查$ scope.auth状态,如果WE PUT IT IN $ rootScope,并检查进入路线的状态,如果状态检查,我们到达那条路线并且它从数据库获取填充内容,否则,即使有人攻击该路由,它也不会看到任何内容,因为没有权限为未授权/错误的电子邮件用户读取该表。

    这是基于这篇文章http://www.ng-newsletter.com/posts/back-end-with-firebase.html的松散基础......我很难改变那个人在那里写的心态,但是,经过一整天,阅读文档(并设置中间件,心灵)你来自Firebase我发现了它,它确实有效。

    与DB的连接暴露在一个BIG对象中,您可以在其中执行任何操作。


    这不是最完整的解释,但是它应该能帮助你做出一些很棒的事情:D

答案 1 :(得分:3)

我遇到的最好的例子叫做angular-app。

它非常全面,可满足您的所有需求。它是由着名的“使用AngularJS掌握Web应用程序开发”一书的作者之一撰写的。

https://github.com/angular-app/angular-app

来自github回购:

AngularJS CRUD应用程序演示 目的

这个想法是演示如何使用AngularJS编写一个典型的,非平凡的CRUD应用程序。为了在最有利的环境中展示AngularJS,我们开始编写一个简化的项目管理工具,支持使用SCRUM方法的团队。示例应用程序尝试显示最佳实践:文件夹结构,使用模块,测试,与REST后端通信,组织导航,解决安全问题(身份验证/授权)。

我们在邮件列表中使用和支持AngularJS时学到了很多,并希望分享我们的经验。

堆栈

持久性存储:在MongoLab上托管的MongoDB 后端:Node.js 客户端上的Awularome AngularJS CSS基于Twitter的bootstrap 构建

这是一个完整的项目,其构建系统专注于AngularJS应用程序,并与AngularJS社区中常用的其他工具紧密集成:

由Grunt.js提供支持 使用Jasmine语法编写的测试 测试由Karma Test Runner执行(与Grunt.js构建集成) 构建支持JS,CSS和AngularJS模板缩小 Twitter的引导程序将LESS模板处理集成到构建中 Travis-CI整合