概要
本文適合沒有nodejs項目開發經驗而又想對nodejs有個大概了解的你閱讀,30分鍾上手,也許還不用
*****************************************************
#准備工作
安裝好nodejs以后,新建文件夾,起名叫demo-project,在文件夾根目錄新建文件app.js作為nodejs應用的入口文件。
打開終端(window上叫命令提示符),進入demo-project根目錄,輸入以下命令並回車初始化package.json
npm init
命令行會提示你輸入項目名稱name/版本version/描述description,都使用默認值(直接按回車)就好,輸入完description后提示輸入應用入口文件名entry point,如果你的入口文件名不叫app.js,輸入對應的名稱就好,否則一路回車到初始化完成。
初始化完成后demo-project根目錄會多出來一個package.json的文件,內容就像這樣
{ "name": "node-project", "version": "1.0.0", "description": "", "main": "app.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", "license": "ISC" }
接下來安裝express,express是一個基於nodejs平台的web開發框架
npm install express --save
准備工作告一段落。
#開啟簡單的服務
express開啟一個服務非常簡單,分三步:引入express=>實例化=>監聽端口
var express = require('express'), app = express(), PORT = 3000; app.get('/', function(req, res){ res.send('Hello World'); }) app.listen(PORT, function(){ console.log('服務器已經啟動~'); })
在終端輸入node app.js啟動服務
打開瀏覽器訪問:localhost:3000,頁面成功打印出Hello World
將app.js中的“Hello World”改成“你好,javascript”,按ctrl+c停止服務然后再輸入node app.js(或者直接按方向鍵⬆)回車重啟服務,刷新瀏覽器,成功打印出“你好,javascript”,為了避免修改一次就重啟一次服務這種無聊的事情,需要安裝supervisor來監聽文件改動自動重啟服務
npm install supervisor --save
mac玩家安裝失敗請嘗試在命令前面加sudo以管理員身份安裝
sudo npm install supervisor --save
安裝完成以后啟動服務請使用supervisor app.js命令,它的作用是啟動並監聽文件狀態,發現文件改動立即自動重啟服務,不必再使用node app.js。
2016年7月2日補充:supervisor在mac環境使用占用cpu超高,筆記本發燙,推薦使用hotnode,用法一樣,比supervisor好一些;
#路由
路由 = 路徑 + http方法
路由是由一個路徑和特定的http方法構成,每個路由可以對應多個處理函數,基本結構app.METHOD(PATH, HANDLER),app是express的實例,METHOD是http請求方式中的一個,path是服務端路徑,HANDLER是路由匹配到時執行的函數
幾個路由實例,可以用ajax分別改變請求type對下面三個接口進行驗證
app.get('/a', function(req, res){ res.send('這是一個get請求'); }) app.post('/b', function(req, res){ res.send('這是一個post請求'); }) app.delete('/c', function(req, res){ res.send('這是一個delete請求'); })
HANDLER 函數有兩個參數req/res,即request/response,請求頭和響應頭,請求頭可以用來獲取請求的參數、當前頁面的路徑等等,響應頭可以向頁面返回數據或渲染指定頁面。
獲取參數有三種方式,詳見:#參數獲取的三種方式
res.render方法指定瀏覽器渲染的頁面,比如寫一個訪問首頁的路由,路徑為/,並向首頁傳遞數據{title: '首頁'}
在項目根目錄下新建文件夾views存放視圖,在views下新建index.jade,jade是nodejs的模板引擎,語法非常簡練,類似的還有EJS模板
// 指定視圖路徑和模板引擎jade var path = require('path'); app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'jade'); // 路由 app.get('/', function(req, res){ res.render('index', { title: '首頁' }) })
index.jade
html
head
title #{title}
body
.content 這里是#{title}
渲染
#獲取參數的三種方式
express獲取前端傳遞過來的參數有三種方式
1、通過路徑傳遞,用req.params.key獲取
// 路由 app.get('/:name', function(req, res){ console.log(req.params.name) res.render('index',{ title: '首頁' }) }) // 假如路徑是 http://localhost:3000/wangmeijian // console.log(req.params.name) // 結果 wangmeijian
2、get方式傳遞,用req.query.key獲取
// 路由 app.get('/', function(req, res){ console.log(req.query.sex) res.render('index',{ title: '首頁' }) }) // 假如路徑是 http://localhost:3000?sex=20 // console.log(req.query.sex) // 結果 20
3、請求參數只要包含鍵值對,用req.body獲取,借用express官網的例子,app.use是中間件,何謂中間件?就是任何請求都要經過它,它可以修改req和res,可以終止請求,可以調用下一個中間件
var app = require('express')(); // 依賴body-parser和multer來解析參數 var bodyParser = require('body-parser'); var multer = require('multer'); // 中間件 app.use(bodyParser.json()); // for parsing application/json app.use(bodyParser.urlencoded({ extended: true })); // for parsing application/x-www-form-urlencoded app.use(multer()); // for parsing multipart/form-data app.post('/', function (req, res) { console.log(req.body); res.json(req.body); })
#靜態文件
文件目錄
jade模板要引用static目錄下單css、js、img等靜態資源,需要先通過express.static托管靜態資源,express.static是express(4.xx版本)唯一一個內置中間件,其它中間件都需要額外安裝
app.use(express.static('static'));
托管之后就可以訪問了,注意訪問路徑不含static
http://localhost:3000/img/a.jpg
http://localhost:3000/css/b.css
http://localhost:3000/js/c.js
#數據庫集成
服務端當然要有數據庫,nodejs支持多種數據庫,比較流行的包括mysql/mongodb,mongodb可以直接以json形式存儲數據,mongodb沒有表和列的概念,與之對應的是集合和字段
先自行安裝mongodb,然后安裝mongoose包,mongoose它可以很方便地在nodejs中操作mongodb
npm install mongoose --save
mongoose有三個概念,模式/模型/文檔
模式用來定義數據類型
模型是模式編譯出來的,可以理解為構造函數
文檔是模式的實例,不理解看看栗子就明白了
var mongoose = require('mongoose'); // localhost為mongodb地址,本地安裝使用localhost即可,testdb為數據庫名稱,如果不存在會自動創建 mongoose.connect('mongodb://localhost/testdb',function(err){ if(err){ return console.error(err); } console.log('數據庫連接成功'); }) // 模式,定義數據類型 var studentSchema = new mongoose.Schema({ name: String, age: Number }) // 模型,第一個參數為模型名稱,第二個參數為模式名,第三個參數是集合名稱,如果不傳,mongodb會自動在模型名稱后面加s做為集合名 var Student = mongoose.model('student', studentSchema); // 文檔 var student = new Student({ name: '張三', age: 21 }) // save方法存入數據庫 student.save(function(err){ if(err){ return console.log(err) } console.log('數據插入成功') // 模型.find方法查詢 Student.find({age: 21},function(err, result){ if(err){ return console.error(err); } console.log('查詢結果:') console.log(result) }) })
#async解決多重嵌套問題
上面的student.save只存入了一次數據然后查詢,代碼只有一層嵌套,假如有這樣一個業務場景,有5條學生信息數據插入數據庫,插入完成后立即查詢出這5條數據,按上面的寫法將會有6層嵌套,嵌套多了,維護是個問題,怎么解決這個問題?
async.each方法解決了這個問題,當然它也需要單獨安裝,async提供簡單而強大的功能來處理javascript異步編程。
npm install async --save
語法:async.each(coll, iteratee, callback),官方文檔
coll遍歷的集合
iteratee迭代過程
callback回調,迭代執行完畢或迭代過程發生錯誤都會觸發回調
栗子🌰
/*#async解決多重嵌套*/ var async = require('async'); var studentSchema = new mongoose.Schema({ name: String, age: Number }) var Student = mongoose.model('student', studentSchema); var data = [ new Student({ name: 'a', age: 18 }), new Student({ name: 'b', age: 28 }), new Student({ name: 'c', age: 32 }), new Student({ name: 'd', age: 26 }), new Student({ name: 'e', age: 29 }) ] async.each(data, function(item, callback){ item.save(function(err){ callback(err); }) },function(err){ if(err){ console.log(err); } // 沒有錯誤表示數據全部插入完成,可以查詢 Student.find({}, function(err, result){ if(err){ return console.log(err); } console.log(result); }) })
查詢結果
{ __v: 0, age: 28, name: 'b', _id: 572d965bcd38199a9c3817c3 }, { __v: 0, age: 18, name: 'a', _id: 572d965bcd38199a9c3817c2 }, { __v: 0, age: 26, name: 'd', _id: 572d965bcd38199a9c3817c5 }, { __v: 0, age: 32, name: 'c', _id: 572d965bcd38199a9c3817c4 }, { __v: 0, age: 29, name: 'e', _id: 572d965bcd38199a9c3817c6 }
有了async.each異步流程控制,告別嵌套,代碼看着也舒服。
以上是nodejs在新手村最初需要弄明白或者會遇到的一些問題。如果看完有幫助,可以給點鼓勵~
作者:王美建
出處:http://www.cnblogs.com/wangmeijian
本文版權歸作者和博客園所有,歡迎轉載,轉載請標明出處。
如果您覺得本篇博文對您有所收獲,請點擊右下角的 [推薦],謝謝!