1. 程式人生 > >Express NodeJs Web框架學習筆記(二)

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客戶端中查詢資料