最近公司要啓動一個移動項目,在後臺系統的選型上,可選的有PHP、Java、NodeJS,從技術上來講,Java較爲成熟,但開發速度較慢,性能穩定;PHP開發迅速,但穩定性不高,性能也通常,開發效率較高;NodeJS的性能較高,能夠處理更多的鏈接和iO問題,因此最終選擇了NodeJS。
NodeJS本質來講是一個服務器端的Javascript,可是其使用起來,並非那麼容易,我大體的學習過程以下,我買了兩本書,一本是樸靈的《深刻淺出NodeJS》,一本是趙坤等的《Node.JS實戰》,相對來講,前者對個人影響更大,讓我對NodeJs有了一個直觀的瞭解,樸靈的介紹偏向底層,對框架性的極少較少,後來我就買了第二本書,可是隻是大體翻了一下,坦白來講,我以前對NodeJS的瞭解等於零,對JQuery也只有粗淺的研究,因此遇到了不少困難。最後我清理了一下思路,選擇Sails MVC框架。
我要解決的問題也很簡單,須要爲移動APP提供後臺支持,須要提供HTTP服務,支持MySQL數據庫,以及其餘的緩存數據庫,並要和PHP框架Laravel開發的WEB程序互通,第一個問題就是須要可以採用一樣的加密算法對密碼加密和比對。這些問題下面會以此解決。
NodeJS的安裝比較簡單,在nodejs.org上下載對應操做系統的包便可,目前的版本是0.10.31,Windows和Mac平臺能夠直接安裝,Linux平臺須要本身編譯,編譯過程很簡單,依次運行./configure,make,sudo make install便可,如今的NodeJS默認會安裝NPM,就是NodeJS的包管理工具,大部分的模塊均可以經過這個工具安裝。
常見的Nodejs資源是nodejs.org和github.com,前者包含官方文檔,後者能夠搜索到一些你須要的包,雖然大部分的包網上都能找到教程,可是教程很容易過期,最好看看github.com上的對應的說明,或者下載安裝模塊後,看模塊目錄下的README.Md,能夠知道一些基本的用法,避免在起始配置上花費過多的時間。
在尋找模塊時,能夠看看其評價,尋找評價較好的模塊,由於nodejs的模塊實在太多了。
開發nodejs時,我知道的工具備nodeclipse、Netbeans、WebStorm,相對來講,WebStorm較好,不過須要錢,nodeclipse也不錯,只不過感受不穩定,Netbeans增長一個插件就能夠了,可是沒有調試功能,只是一個運行命令而已,好在它的編輯功能很強大。其餘的sublime和notepad++均可以用,最終我用的仍是Netbeans,由於能夠和PHP、Java程序公用一個環境,Eclipse有點太大了,最近不怎麼喜歡了。
nodejs的程序其餘的程序如PHP、Java有很大的不一樣,若是它有的地方出錯了,整個系統就崩潰了,但PHP和Java都不會,他們只會在出錯的地方出錯,其餘的地方正常運行。由於nodejs本質來講,其主體線程只有一個,崩潰了就沒有了。因此要特別當心,可是也有其優勢,訪問全局變量要容易的多,好比Sessioin、緩存等。不過一樣須要注意其內存分配問題,全局變量可能會永遠存在,容易形成內存泄漏問題。
安裝nodejs模塊的命令式npm install module_name,這會在當前目錄下建立一個node_modules,裏面是包含的模塊,若是要安裝全局模塊,須要用npm install module_name -g,這會在主目錄下建立node_modules,裏面存儲包含的模塊。模塊名能夠在命令中指定,也能夠在當前目錄下的package.json中指定。下面以express爲例說明一下。
學習nodejs常見的組件是express,這是一個簡單的提供http服務的mvc框架,相似於PHP的laravel,或者Java的Spring,固然其功能要弱一些,安裝命令爲npm install -g express,而後用express命令安裝,有如下幾種狀況:
express #在當前目錄下建立express框架,默認使用jade引擎
express -e #在當前目錄下建立express框架,默認使用ejs引擎
express project#在project目錄下建立express框架,默認使用jade引擎
express -e project#在project目錄下建立express框架,默認使用ejs引擎
express --version #顯示當前版本
也能夠用express -h,查看全部的幫助信息
默認的頁面渲染引擎有兩種: jade和ejs,ejs相似於php的方式將js腳本嵌入到html代碼中,雖然看起來比較亂,可是習慣了也沒什麼,jade有點難以理解,不太適應,好像效率也不高,就選擇了ejs引擎。
默認的package.json以下
{
"name": "test",
"version": "0.0.0",
"private": true,
"scripts": {
"start": "node ./bin/www"
},
"dependencies": {
"express": "~4.9.0",
"body-parser": "~1.8.1",
"cookie-parser": "~1.3.3",
"morgan": "~1.3.0",
"serve-favicon": "~2.1.3",
"debug": "~2.0.0",
"ejs": "~0.8.5"
}
}
在運行完express -e命令以後,系統會提示你到目錄中運行npm install命令,這個命令會根據package.json的dpendencies的屬性下載模塊安裝。如須要增長session支持,能夠運行npm install express-session,也能夠在package.json的dependencies增長一行,以下
"dependencies": {
"express": "~4.9.0",
"body-parser": "~1.8.1",
"cookie-parser": "~1.3.3",
"morgan": "~1.3.0",
"serve-favicon": "~2.1.3",
"debug": "~2.0.0",
"ejs": "~0.8.5",
"express-session":"*"
}
而後運行npm install命令就能夠了。
運行express的命令以下:
node ./bin/www
就是在根目錄下的bin目錄下的www文件,這是一個js文件,運行以後,就能夠在瀏覽器中查看運行結果,默認的首頁爲http://localhost:3000,
express框架的目錄也很清楚,大體以下
D:.
│ app.js #主要的入口文件,或者提及始文件
│ package.json #模塊配置文件
│
├─bin
│ www #啓動文件:命令爲 node www
│
├─public #一些靜態文件,如圖片、JS、CSS文件
│ ├─images
│ ├─javascripts
│ └─stylesheets
│ style.css
│
├─routes #路由文件,目前express支持將將一個虛擬目錄下的請求放到要給路由文件中,這是在app.js中定義的
│ index.js #app.use('/',routes) ->根目錄下的路由
│ users.js #app.use('/user',users) ->user目錄下的路由
│
└─views #mvc的view層,目前都爲ejs文件
error.ejs
index.ejs
不過目前來講,express不支持控制器,其邏輯經常要寫在routes文件中,不過能夠將邏輯放在其餘文件中,而後require進來。
默認的路由文件index.js以下:
var express = require('express');
var router = express.Router();
/* GET home page. */
router.get('/', function(req, res) {
res.render('index', { title: 'Express' });
});
module.exports = router;
1)req
req.params.name ->/user/:name
req.query.name ->/user?name=shiyq
req.body.name ->名稱爲name的表單輸入值
req.param(name) ->以上的三種輸入都支持,次序爲params,body,query
req.cookie.name ->cookie的name屬性
2)res
res.cookie(name,value) ->設置cookie
res.redirect('/foo/bar') ->跳轉到/foo/bar
res.location('foo/bar') ->相似redirect
res.send('<p>name</p>') ->向瀏覽器輸出
res.json() ->想瀏覽器返回json數據
res.render(view, [locals], callback) ->轉向view,並攜帶變量
res.end() ->結束輸出
讓express支持session,須要安裝express-session模塊,查看相應模塊下的README.Md文件,能夠看到以下內容
var express = require('express')
var session = require('express-session')
var app = express()
app.use(session({
secret: 'keyboard cat',
resave: false,
saveUninitialized: true
}))
可知這個express-session須要緊跟express的定義,其使用方式是app.use(),若是位置太靠後,可能會出現問題,須要注意,其默認使用方式爲req.session.name,默認的express-session將session保存在內存中,若是想保存到redis,memcache以及mongodb,須要集成另外的組件,能夠在github.com上尋找,同時要記得閱讀README.Md文件
到此爲止,就能夠進行基本的express開發了,可是很容易發現修改了代碼以後,系統並不生效,nodejs沒有所謂的熱啓動機制,須要從新啓動程序,不過每次啓動就太麻煩了,因此要使用自動啓動的工具,supervisor,安裝方式爲npm install supervisor -g,執行命令爲supervisor app.js,能夠用supervisor -h查看幫助,通常來講須要設置-w或者-i開關,-w表明監控的目錄,只有這些目錄下的文件修改了纔會從新啓動node,默認爲當前目錄「.」,目錄以「,」間隔,-i是忽略某些目錄。-w開關很是有用,好比某些程序會在當前目錄下建立臨時文件,就會不停的重啓,須要設置只有某些目錄修改才須要啓動,如sails框架,其目錄結構以下
這裏明顯有個臨時文件.tmp,若是直接運行supervisor app.js,就會出現不停重啓的現象,因此我在根目錄下寫了一個sailsjs.bat文件,內容爲
supervisor -w api,assets,config,node_modules,tasks app.js
這就能夠解決不停重啓的問題了。