2015年8月16日 星期日

Node.js的強大Web Framework - SailsJS

sails

sails是一套功能強大的web framework,他有express的template generate功能,也具備restful api的產生功能,更可以跟後端的資料庫進行restful api與orm對應整合...

Github repository

Installation

sudo npm -g install sails

Sample Usage

Sails的指令語法與express相仿,下面介紹他的基本使用:

建立新專案

sails new [project name]

啟動專案

一般express的專案會需要在建立完之後做"npm install"的套件安裝動作,但在sails中,他會直接用symbolic link將套件鏈結到sails已經有的套件位置,讓整個安裝與啟動過程可以更加快速。
cd $project
sails lift

使用auto generate的restful api

建立一個user物件

在該application建立user物件api:
sails generate api user
執行呼叫建立user物件:
curl http://localhost:1337/user/create
如果一切無誤,會看到下面的回覆:
{"createdAt":"2015-08-15T17:28:53.366Z","updatedAt":"2015-08-15T17:28:53.366Z","id":1}
查詢所有的user列表:
curl http://localhost:1337/user/find
回覆如下:
[{"createdAt":"2015-08-15T17:28:53.366Z","updatedAt":"2015-08-15T17:28:53.366Z","id":1}]
查詢id=1的user
curl http://localhost:1337/user/1
如果該id可以查得到對應的物件,則會就該物件資訊回覆
{"createdAt":"2015-08-15T17:28:53.366Z","updatedAt":"2015-08-15T17:28:53.366Z","id":1}
而針對查詢不到的id,則會有以下訊息:
$ curl http://localhost:1337/user/3
No record found with the specified `id`.

開發一個頁面

對照express的使用方式,express是直接在app.js中建立routing(ex: app.get('/api/:id', ...))或是express4中,在routing資料夾中建立對應的routing然後再link回app.js,並且對應頁面樣板到views資料夾下面。 而sails中,則是在config/routes.js中定義routing,而所指定的頁面樣板,一樣指定到views資料夾下。

在Express中

Express - app.js
app.get('/test/:data', function(req, res, next){
    res.render('result', {data:'api data:' + req.params.data});
})
Express - views/result.ejs
<%- data %>

在Sails中

Sails - config/routes.js
module.exports.routes = {
  '/test/:data':
    { controller: 'Result', action: 'hello' }
}
這邊需要注意,在我們指定controller的部分,Result是一個short name,實際建立檔案時候需要用ResultController.js,Sails才找得到這個檔案...,除了這樣寫,也可以用下面的方式:
直接使用字串方式,用short name呈現:
'/test/:data': 'Result.hello'
直接使用字串方式,用full name呈現:
'/test/:data': 'ResultController.hello'
或是透過json方式並以玩逞名稱定義:
'/test/:data':
    { controller: 'ResultController', action: 'hello' }
另外,可以在routing前面指定request method:
'POST /test/:data': 'Result.hello'
或是用萬用字元處理:
'POST /test/*': 'Result.hello'
Sails - api/controllers/ResultController.js
module.exports = {
  hello: function(req, res) {
    return res.send(JSON.stringify({data: '123'}));
  }
}
除果希望抓到routing所傳入的參數,可以透過req.params['param_name']的方式來抓:
module.exports = {
  hello: function(req, res) {
    return res.send(JSON.stringify({data: req.params.data}));
  }
}

資料與頁面樣板整合

一般我們會在Controller中去存取資料庫資料,然後再帶到頁面去做rendering,在Sails可以這樣做:
Sails - api/controllers/ResultController.js
module.exports = {
  hello: function(req, res) {
    var data = req.params.data;
    res.view('result', {data: data});
  }
}
其中res.view()的第一個參數是頁面樣板的名稱,通常我們放在views資料夾中;第二個參數就是我們帶入的資料...
Sails - views/result.js
頁面的資料存取,則以ejs的語法即可,例如上面傳入的json中有個data,這邊就可以直接用data來接值...
The data is: <%- data %>

參考