乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      Sails使用介紹

       念念爸 2016-08-04

      前言

      入手Node.js半年,從用Express開發(fā)自己的博客到用Sails開發(fā)公司項目,深深被Sails震撼了。Sails是Balderdash團隊的產(chǎn)品,快速的項目構(gòu)建、優(yōu)秀的框架結(jié)構(gòu)還有眾多的擴展,讓我有種相見恨晚的感覺。在Koa流行之前,個人認(rèn)為Sails的用戶量還是挺可觀的。今天,我想寫一寫Sails那些讓我感動的地方,順便理順一下Sails的架構(gòu)。

      ####目錄

      • 一步搭建項目
      • 項目架構(gòu)
      • ORM
      • MVC的實現(xiàn)
      • 路由
      • 安全
      • 日志
      • 單元測試
      • WebSocket

      一步搭建項目

      在安裝了Node.js 和 Sails的環(huán)境下,只需要一條命令,就能夠搭建一個擁有完整架構(gòu)的項目,盡管這很簡單,我還是覺得有必要說一下。

      在已經(jīng)安裝了Node.js和npm的前提下,首先你需要全局下安裝Sails $ sudo npm install sails -g

      其次在一個空路徑下,新建一個項目 $ sails new newApp

      最后,只需要前往項目路徑,把項目運行起來 $ cd testProject $ sails lift

      訪問 http://localhost:1337就能看到一個新的項目

      new app

      項目架構(gòu)

      .
      ├── api
      │   ├── controllers
      │   ├── models
      │   ├── policies
      │   ├── responses
      │   └── services
      ├── views
      ├── assets
      ├── config
      ├── tasks
      ├── node_modules
      ├── package.json
      ├── Gruntfile.js
      ├── README.md
      └── app.js

      api/

      api 目錄下是你要構(gòu)建應(yīng)用的核心所在,常說的MVC的設(shè)計結(jié)構(gòu)就體現(xiàn)在這里 api/controllers :控制層,該層是Http請求的入口。Sails官方建議該層只處理請求的轉(zhuǎn)發(fā)和頁面的渲染,具體的邏輯實現(xiàn)應(yīng)該交給Service層。 api/models:模型層,在Sails中,對于Model采用的是充血模型,除了可以在模型中定于屬性之外,還可以定義包含邏輯處理的函數(shù)。在Sails中,所有Model都可以全局性訪問。 api/policies:過濾層,該層在Controller層之前對Http請求做處理,在這一層中,可以定于一些規(guī)則來過濾Http請求,比如身份認(rèn)證什么的。 api/responses:http響應(yīng)的方法都放這里,例如服務(wù)器錯誤、請求錯誤、404錯誤等,定義在responses文件夾里面的方法,都會賦值到controller層的req對象中。 api/services:服務(wù)層,該層包含邏輯處理的方法,在Sails中,所有Service都可以全局性訪問。

      views/

      視圖層,存放視圖模版文件的地方,Sails默認(rèn)是提供ejs模版引擎的,如果你愿意,你可以換成jade、handlebars或者任何你喜歡的模版引擎。

      assets/

      資源文件夾,在Sails啟動的時候,會啟動某一個Grunt任務(wù),把assets文件夾里的內(nèi)容或壓縮或編譯或復(fù)制到根目錄下的.tmp目錄,這是前端可以直接通過路由訪問的資源,HTML、JS、CSS以及圖片等靜態(tài)資源都放在這里了。

      config/

      配置文件夾,在Sails啟動的時候,會加載該文件夾里的文件,并賦值在全局對象sails.config中,所以能夠在任何一個地方都能用到。在用Sails開發(fā),會經(jīng)常跟這個文件夾里的文件打交道,從config的構(gòu)成很容易知道Sails都提供哪方面的功能。

      tasks/

      Sails自帶的項目自動化工具是Grunt,而Grunt的配置和任務(wù)注冊都放在這個文件夾里了。這里已經(jīng)提供了通常會用到的CSS編譯、JS壓縮、文件合并,更改檢測等等任務(wù),當(dāng)然如果沒有自己需要的,還能擴展。

      app.js

      Sails的啟動文件,無論是$ sails lift命令或者$ npm start命令都會運行該文件。

      ORM

      開發(fā)了Sails的團隊Balderdash,還開發(fā)了一套ORM框架:Waterline。
      Waterline在Sails主要的舞臺是在/api/models目錄里,在這里定義的模型文件,在Sails啟動的時候,都要經(jīng)由Waterline的洗禮。
      Waterline 是通過Adapter關(guān)聯(lián)數(shù)據(jù)庫的,不同的Adapter關(guān)聯(lián)不同的數(shù)據(jù)庫。
      Waterline 能適配絕對部分?jǐn)?shù)據(jù)庫,大致分類兩類,一類是官方團隊開發(fā)的 Adapter適配的,一類是民間開發(fā)者開發(fā)的Adapter適配的:
      官方支持的:

      • PostgreSQL
      • MySQL
      • MongoDB
      • Redis
      • Disk
      • Memory

      民間開發(fā)的:

      • SQLServer
      • OrientDB
      • Oracle
      • Cassandra

      關(guān)于Waterline的更多信息可以關(guān)注:
      github:waterline
      github:waterline-docs

      MVC的實現(xiàn)

      在這一段我想不僅僅要談?wù)摰組odel層、View層和Controller層,我認(rèn)為還有必要談到Service層、和Policy層。

      Model層

      模型文件定義到/api/models中,由Waterline驅(qū)動,所有model都能全局訪問。Sails提供命令行創(chuàng)建model的命令:$ sails generate model MODEL_NAME

      View層

      實現(xiàn)在/views中,除了默認(rèn)提供的ejs模版引擎之外,還能更換成jade、handlebars等模版引擎

      Controller層

      /api/controller目錄里,Sails中提供創(chuàng)建controller的命令:$ sails generate controller CONTROLLER_NAME。Sails也提供同時創(chuàng)建model和對應(yīng)的Controller的命令:$ sails generate api API_NAME

      Service層

      /api/services目錄里,存放自定義的服務(wù),所有service都能夠全局訪問,Sails官方的建議是把邏輯處理都放在該層中,Controller層只做路由的分發(fā)和輕邏輯的處理。

      Policy層

      /api/policies目錄里,存放自定義的過濾器。該層是一條請求在到達Controller之前根據(jù)需求過濾請求的中間層。在/api/policies目錄中定義的文件,還需要在config/policies.js文件中為需求應(yīng)用到某一過濾器的Action配置。

      路由

      Sails中要理解路由,首先要記得這個名詞blueprint,中文翻譯為:藍圖。我不知道官方是否解釋過為什么要用個單詞,但以我的理解,Sails的blueprint是負(fù)責(zé)指揮每一條客戶端請求應(yīng)該分配到服務(wù)器端的哪個Action去,所以叫藍圖吧。 blueprint主要分為三種:RESTful routes、Shortcut routes、Action routes。

      RESTful routes

      當(dāng)路徑諸如:/:modelIdentity 或者 /:modelIdentity/:id的時候,blueprint會根據(jù)HTTP的動作(GET、POST、DELETE、PUT等)來分配到相應(yīng)的Controller下相應(yīng)的Action來處理。例如一個POST請求/user會創(chuàng)建一個用戶,一個DELETE請求/user/123會刪除id為123的用戶。

      Shortcut routes

      這種路由主要是方便開發(fā),請求的參數(shù)可以直接寫在請求路徑中,例如/user/create?name=joe會創(chuàng)建一個新的用戶,/user/update/1?name=mike會更新id為1的用戶的名字。shortcut routes在開發(fā)環(huán)境很便利,但是在生產(chǎn)環(huán)境下需要關(guān)閉。

      Action routes

      這種路由會自動的為Controller層的每一個Action創(chuàng)建一個路由,例如你的Controller層有一個FooController.js,里面有一個Actionbar,那么請求/foo/bar就會分配到barAction。

      當(dāng)然Sails也會提供自定義的路由,用戶可以在config/routes.jsconfig/polices.js這兩個配置文件中選擇關(guān)閉或者打開blueprint提供的路由,和定義自己的路由。

      安全

      要確保產(chǎn)品的安全性,要對幾種常見的攻擊和安全策略了如指掌,諸如CORS、CSRF、DDOS、XSS等。Sails對于常見的安全策略都有提供支持,且只需要通過相關(guān)的配置文件就可以控制安全策略的等級。深入探討Web的安全策略,并不在本文的范疇內(nèi),日后我會以這個為題寫一篇文章聊聊Web的安全。 想要了解更多Sails的安全策略可以看看這里:sails: security

      日志

      Sails提供了一個全局對象sails.log用來處理日志信息的輸出,日志是分level的,在config/log.js中配置日志輸出的level,而level的作用看下表:

      Priority level Log fns visible
      0 silent N/A
      1 error .error()
      2 warn .warn(), .error()
      3 debug .debug(), .warn(), .error()
      4 info .info(), .debug(), .warn(), .error()
      5 verbose .verbose(), .info(), .debug(), .warn(), .error()
      6 silly .silly(), .verbose(), .info(), .debug(), .warn(), .error()

      Sails的日志管理默認(rèn)是info層的,既會輸出.info(), .debug(), .warn(), .error()的信息。

      單元測試

      Sails使用了mocha進行單元測試,在新建Sails項目的時候,沒有創(chuàng)建單元測試的文件夾,需要自己手動構(gòu)造單元測試目錄,官方建議的目錄是這樣的:

      .
      ├── api
      ├── assets
      ├── ...
      ├── test
      │  ├── unit
      │  │  ├── controllers
      │  │  │  └── UsersController.test.js
      │  │  ├── models
      │  │  │  └── Users.test.js
      │  │  └── ...
      │  ├── fixtures
      │  ├── ...
      │  ├── bootstrap.test.js
      │  └── mocha.opts
      └── views

      而我在單元測試常用的組合是:mocha、should、supertest、 istanbul  其中should是提供斷言,supertest是用于測試Controller層的時候偽造http請求的,而istanbul則是提供測試代碼覆蓋率的。 關(guān)于怎么在Sails中編寫測試代碼,可以參考 sails:testing

      WebSocket

      對于有即時性通訊需求的Web應(yīng)用,我們會用Socket,Sails也為這方面提供了支持。在客戶端提供js文件:sails.io.js,而在服務(wù)器端提供全局對象:sails.sockets。通過這兩個對象,就可以進行客戶端和服務(wù)器端即時性通訊的開發(fā)了。 Sails默認(rèn)會啟動WebSocket功能,在客戶端訪問服務(wù)器端的時候,會自動嘗試在同域名下連接socket。 值得注意的是,這樣會對AngularJS、EmberJS等前端MVVC開發(fā)產(chǎn)生一些障礙。 比如進行AngularJS開發(fā)的時候,我們在http://localhost:9000跑AngularJS項目,而服務(wù)器端卻跑在http://localhost:1337。 當(dāng)訪問http://localhost:9000的時候,sails.io.js會嘗試于當(dāng)前路徑下進行socket連接,也就是http://localhost:9000,這時會出錯,因為服務(wù)器是跑在http://localhost:1337的。 在開發(fā)的時候要解決這樣的問題的時候,我們只需要在AngularJS這邊引入sails.io.js之后定義連接路徑就行了:

      <script src="scripts/lib/sails.io.js"></script>
      <script>io.sails.url = "http://localhost:1337";</script>

      結(jié)語

      可以說Sails涵蓋了Web開發(fā)中會遇到的絕大部分需求和問題,如果深入研究Sails的話,是受益匪淺的。


      原文連接:為什么使用Sails?


      如果本文對您有用 請不要吝嗇你們的Follow與Start 這會大大支持我們繼續(xù)創(chuàng)作

      「Github」 MZMonster :@MZMonster JC_Huang :@JerryC8080

      「簡書」 MZMonster:@MZMonster JC_Huang:@JC_Huang

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多