Express NodeJs Web框架學習筆記(二)
繼續之前的學習,之前學了簡單Express不是以及安裝的使用方法,下面我們進一步學醫Express路由,中介軟體以及資料庫持久化處理
Route模組
在上面示例中,我們可以使用下面的程式碼建立路由
var express = require('express')
var app = express()
app.get("/",function(req,res,next){})
app.get("/book",function(req,res,next){})
app.post("/book",function(req,res,next){})
顯然這樣並不利於我們的程式碼管理,因此這裡引入express.Route
-
建立 GET /
-
建立 GET /book/nodejs
-
建立POST /book/
其中 /book/**單獨存放於路由模組中
app.js
同級目錄下建立book.js
檔案程式碼內容如下:
var express = require('express');
// 建立router
var router = express.Router();
// 在router中設定路由
router.get('/:id', function (req, res, next) {
var book = {
id: req.params.id,
name: "深入淺出NodeJS"
};
res.send(JSON.stringify(book))
});
router.post("/", function (req, res, next) {
res.send("POST /book")
});
// 對外暴露
module.exports = router;
同樣的app.js
則需要引入上面router檔案
// 引入依賴
var express = require('express')
var app = express()
// 引入router
var book_router = require ('./book')
// 定義port常亮
const port = 3030;
// app 使用該router
app.use('/book',book_router)
// 建立一個簡單GET路由
app.get("/",function(req,res){
res.send("Hello,World");
});
// 啟動服務,第二個引數為callback()
app.listen(port,function(){
console.log(`Express 應用啟動在${port} 埠`);
});
啟動應用,在命令列中訪問,即結果如下:
$ curl -XGET http://localhost:3030/
Hello,World
$ curl -XGET http://localhost:3030/book/ISBN-123
{"id":"ISBN-123","name":"深入淺出NodeJS"}
$ curl -XPOST http://localhost:3030/book/
POST /book
NodeJs中的中介軟體
中介軟體,英文middleWare
,假設我們需要在控制檯列印所有請求的消耗的時間資訊,以及URL,那麼我們給每個路由都加上程式碼,顯然是很愚蠢的,那麼我們可以為這些路由請求設定中介軟體,利用中介軟體來而完成統計.
修改appjs
程式碼為以下內容:
// 引入依賴
var express = require('express')
var app = express()
const port = 3030
/**
* 定義中介軟體函式
* @param req ---> requesr
* @param res ---> response
* @param next ---> 將請求傳遞到下一個中介軟體函式
*/
function logMiddleWare(req, res, next) {
var url = req.originalUrl;
// 記錄開始執行時間
var start = Date.now();
// 向request中寫入資料,在後面的中介軟體函式中可以獲取到該引數
req.start_time = start
// 執行下一個中介軟體函式(在這裡也就是路由的callback)
next();
// 記錄完成時間
var end = Date.now();
// 列印日誌
console.log(`${url} 請求完成時間:`, end - start, "ms");
}
// 使用該中介軟體
app.use(logMiddleWare)
app.get("/time", function (req, res, next) {
console.log(`獲取到的引數start_time = ${req.start_time}`);
res.send(`<h1>/${req.start_time}</h1>`);
});
// 服務啟動
app.listen(port, function () {
console.log(`服務啟動在${port} 埠`);
});
我們測試以下:
curl -XGET http://localhost:3030/time
返回<h1>1541220185998</h1>
,這裡主要看一下控制檯列印的資訊
服務啟動在3030 埠
獲取到的引數start_time = 1541220185998
/time 請求完成時間: 6 ms
可以看到,首先是服務啟動在3030 埠資訊,接著我們開始請求/time,記錄下了start_time,並寫入到request中,接著在/time的回撥函式中列印了該引數,執行完成之後,繼續返回到 logMiddleWare 中記錄下end_time,打印出耗時 6 ms
整合持久層(redis)
NodeJS支援多種資料庫持久操作,比如常用的Redis,Mysql,MongoDB等等,那麼這裡我們簡單的使用redis作為測試以下.首先說一下需求:
-
建立一個請求為 POST /redis/:content 將content寫入到redis中
-
建立一個請求為 GET /redis 使用者獲取之前的設定
Ps: 這裡我是用了docker來部署了一個redis伺服器,如下
$ docker pull redis
$ docker run -d -p 6379:6379 --name redis_6379 redis
$ docker ps # 觀察Redis執行情況
# 重啟redis `docker restart redis_6379`
首先你需要安裝redis依賴,專案目錄下執行npm install redis --save
安裝即可,修改app.js
內容如下
// 引入依賴
var express = require('express');
var redis = require('redis')
var app = express()
const port = 3030
const redis_port = 6379
// 建立Redis client 埠為6379
var client = redis.createClient(redis_port,'localhost');
/**
* 設定Redis的回撥事件,當redis出現連線失敗的時候,執行之
*/
client.on('error',function (error) {
console.log("Redis 連接出現異常")
});
app.post("/redis/:content",function (req, res, next) {
var content = req.params.content;
// 設定字串到redis中 KV結構
client.set('KEY',content)
res.send("Redis設定完成")
})
app.get("/redis",function (req, res, next) {
client.get('KEY',function (err, value) {
res.send(value)
})
})
// 服務啟動
app.listen(port, function () {
console.log(`服務啟動在${port} 埠`);
});
測試內容如下
$ curl -XPOST http://localhost:3030/redis/Keep_it_simple_and_stupid
Redis設定完成
$curl -XGET http://localhost:3030/redis
Keep_it_simple_and_stupid
當然也可以在Redis客戶端中查詢資料