NodeJS學習筆記(一)


    最近公司要啟動一個移動項目,在后台系統的選型上,可選的有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,查看所有的幫助信息
  目前的express的版本為4.9.0,在4.0之后,默認的express框架不再集成常見的connect模塊,詳細的connect信息可以參考https://github.com/senchalabs/connect,比如想要增加session支持,可以參考頁面上的express-session模塊。
  默認的頁面渲染引擎有兩種: 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;
這個也非常容易理解,這里只有一個針對根目錄的路由,是以get方式訪問的,對應的函數有兩個參數,req和res,分為為輸入對象和輸出對象。具體的api說明可以訪問主站頁面: http://expressjs.com/4x/api.html,下面做個簡單的概括
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
這就可以解決不停重啟的問題了。
    
   


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM