国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

為什么使用Sails?

xi4oh4o / 3259人閱讀

摘要:原文鏈接為什么使用前言入手半年,從用開發自己的博客到用開發公司項目,深深被震撼了。我不知道官方是否解釋過為什么要用個單詞,但以我的理解,的是負責指揮每一條客戶端請求應該分配到服務器端的哪個去,所以叫藍圖吧。

原文鏈接:BlueSun | 為什么使用Sails?

前言

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

目錄

一步搭建項目

項目架構

ORM

MVC的實現

路由

安全

日志

單元測試

WebSocket

一步搭建項目

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

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

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

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

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

項目架構
.
├── api
│?? ├── controllers
│?? ├── models
│?? ├── policies
│?? ├── responses
│?? └── services
├── views
├── assets
├── config
├── tasks
├── node_modules
├── package.json
├── Gruntfile.js
├── README.md
└── app.js
api/

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

views/

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

assets/

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

config/

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

tasks/

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

app.js

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

ORM

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

PostgreSQL

MySQL

MongoDB

Redis

Disk

Memory

民間開發的:

SQLServer

OrientDB

Oracle

Cassandra

關于Waterline的更多信息可以關注:
github:waterline
github:waterline-docs

MVC的實現

在這一段我想不僅僅要談論到Model層、View層和Controller層,我認為還有必要談到Service層、和Policy層。

Model層

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

View層

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

Controller層

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

Service層

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

Policy層

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

路由

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

RESTful routes

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

Shortcut routes

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

Action routes

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

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

安全

要確保產品的安全性,要對幾種常見的攻擊和安全策略了如指掌,諸如CORS、CSRF、DDOS、XSS等。Sails對于常見的安全策略都有提供支持,且只需要通過相關的配置文件就可以控制安全策略的等級。深入探討Web的安全策略,并不在本文的范疇內,日后我會以這個為題寫一篇文章聊聊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的日志管理默認是info層的,既會輸出.info(), .debug(), .warn(), .error()的信息。

單元測試

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

.
├── 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則是提供測試代碼覆蓋率的。
關于怎么在Sails中編寫測試代碼,可以參考 sails:testing

WebSocket

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


結語

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

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

「Github」
MZMonster :@MZMonster
JC_Huang :@JerryC8080

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/78937.html

相關文章

  • Sails.js 內存暴漲 & 源碼分析

    摘要:是下的一個優秀的框架,但是使用后,在流量增長時,進程有時突然內存暴漲保持高占用。如果是內存泄露引起的,則需要細心檢查代碼,確定變量能正常回收。每個對象有自己產生的內存。譯注但是大對象內存區本身不是可執行的內存區。 Sails.js 是 node 下的一個優秀的 MVC 框架,但是使用 Sails 后,在流量增長時, node 進程有時突然內存暴漲、保持高占用。經過翻閱源碼后,發現這個問...

    antz 評論0 收藏0
  • Sails+MVC+Mysql+Node+學習筆記一

    摘要:業務邏輯處理層,采用的的語法編寫。配置層這層里面有和兩層,然后和一些。所以遇到這個情況就檢查是不是鏈接配的有問題或者的服務已關閉。在瀏覽器輸入查出來的結果如圖所示這條數據手動添加的,這樣一個很簡單的算完成了。官網官網阮一峰模塊 showImg(https://segmentfault.com/img/remote/1460000010885716); 項目構建 安裝Node就不多說了,...

    W4n9Hu1 評論0 收藏0
  • 基于RESTful API 怎么設計用戶權限控制?

    摘要:原文鏈接基于怎么設計用戶權限控制前言有人說,每個人都是平等的也有人說,人生來就是不平等的在人類社會中,并沒有絕對的公平,一件事,并不是所有人都能去做一樣物,并不是所有人都能夠擁有。 原文鏈接:BlueSun | 基于RESTful API 怎么設計用戶權限控制? 前言 有人說,每個人都是平等的;也有人說,人生來就是不平等的;在人類社會中,并沒有絕對的公平,一件事,并不是所有人都能去做;...

    sumory 評論0 收藏0
  • 基于RESTful API 怎么設計用戶權限控制?

    摘要:原文鏈接基于怎么設計用戶權限控制前言有人說,每個人都是平等的也有人說,人生來就是不平等的在人類社會中,并沒有絕對的公平,一件事,并不是所有人都能去做一樣物,并不是所有人都能夠擁有。 原文鏈接:BlueSun | 基于RESTful API 怎么設計用戶權限控制? 前言 有人說,每個人都是平等的;也有人說,人生來就是不平等的;在人類社會中,并沒有絕對的公平,一件事,并不是所有人都能去做;...

    X1nFLY 評論0 收藏0

發表評論

0條評論

xi4oh4o

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<