1. 程式人生 > >Express 4.x中介軟體morgan(logger)的詳細解析

Express 4.x中介軟體morgan(logger)的詳細解析

開頭先說寫無關的話: 看了很多技術部落格,最痛恨的就是那種拷貝貼上黨,要麼就是那種原文翻譯混亂黨, 都是屬於無腦型。
不僅如此,格式也是讓人心生絕望。浪費了很多時間。
當然有些人寫這些只是給自己記的筆記,自己也不能太過激。
好了,牢騷發過了,現在寫正題。
express 4.x相比express 3.x有很大的改進。
特別是中介軟體方面,已經不再相容,需要自己去下載。
所以只要碰到這種格式的 express.middleware, 在express 4.x都是用不了的。
以前的中介軟體logger模組,現在已經改名叫morgan了。
愚蠢的我也是踩了這些坑。

先安裝模組

npm install morgan --save 

morgan的用途就是記錄http通訊時的操作日誌。
先上點程式碼吧。
這是伺服器端, app.js:

var express = require('express'); 
var morgan = require('morgan');
var app = express();
app.use(morgan('combined'));//運用中介軟體,‘combined’是日誌顯示的格式,後面會看到什麼樣
app.get('/index2.html', function (req, res) {
    res.sendFile(__dirname + '/index2.html'
); }); //將本地資料夾中的index2.html檔案傳到客戶端 app.post('/index2.html', function (req, res) { req.on('data', function (data) { console.log(data.toString()); res.end(); }); //響應index2.html的post請求 }); app.listen(1338);//監聽localhost:1338埠

這是客戶端html2.html檔案:
通過ajax來post表單的資訊,我承認有點傻,其實直接表單提交就好了,但是就當是再學習下ajax吧。

<!DOCTYPE html>
<html>

<head>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />

    <script>
        function submitData() {
            var obj = {
                firstname: document.getElementById('txtFirstName').value,
                lastname: document.getElementById('txtLastName').value,
            };
            var xhr = new XMLHttpRequest();
            xhr.open('POST', 'index2.html', true);
            xhr.onload = function (e) {
                if (this.status == 200) {
                    document.getElementById('result').innerHTML = this.response;
                }
            };
            xhr.send(JSON.stringify(obj));
        }
    </script>
</head>

<body>
    <form id="form1">
        firstname:
        <input type="text" id="txtFirstName" name='firstname' value='ss' /></br>
        lastname:
        <input type="text" id="txtLastName" name="lastname" value="ll" /></br>
        <input type="button" value="submit" onclick="submitData()" />
    </form>
    <output id="result"></output>
</body>

</html>

來,咱們執行起來

yourPath/node app.js

可以看到如下介面:

先看看你的node.js的控制檯吧:

::1 - - [23/Aug/2017:03:40:52 +0000] “GET /index2.html HTTP/1.1” 200
1095 “-” “Mozilla/5.0 (Wi ndows NT 6.1; WOW64) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36 “

點選submit按鈕後,再看看你的node.js控制檯吧。

{“firstname”:”ss”,”lastname”:”ll”}
::1 - - [23/Aug/2017:03:42:27
+0000] “POST /index2.html HTTP/1.1” 200 - “http://localhost:1338 /index2.html” “Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36
(KHTML, like Gecko) Chro me/60.0.3112.101 Safari/537.36”

記錄了一堆資訊,但是格式那是相當的亂。

好了,現在問題來了,我怎樣儲存這些資訊呢?
morgan提供了寫入檔案流來將這些資訊儲存在檔案中:
我們改下服務端程式碼:

var express = require('express');
var morgan = require('morgan');
var fs = require('fs');//加了檔案操作的模組
var path = require('path');//加了解析路徑的模組
var app = express();
var accessLogStream = fs.createWriteStream(path.join(__dirname, 'access.log'), { flag: 'a' });//建立一個寫檔案流,並且儲存在當前資料夾的access.log檔案中
app.use(morgan('combined', { stream: accessLogStream }));//設定開啟檔案流,並且指明檔案流的物件
app.get('/index2.html', function (req, res) {
    res.sendFile(__dirname + '/index2.html');
});
app.post('/index2.html', function (req, res) {
    req.on('data', function (data) {
        console.log(data.toString());
        res.end();
    });
});
app.listen(1338);

再次執行並且重複上面的操作,看看你的日誌檔案吧:
這裡寫圖片描述

內容已經成功儲存!

可是有人說這些太亂七八糟了,我其實只想儲存少量資訊,沒問題!
你可以這樣寫:

app.use(morgan('tiny', { stream: accessLogStream }));

這樣僅僅儲存有限的資訊
執行出來資訊是這樣的:

GET /index2.html 304 - - 6.205 ms

還有人比較有強迫症,說我只能接受某種格式,不想用正則再轉換了!
這個。。。也行!
我們再次改下運用中介軟體的方法:

app.use(morgan(function (tokens, req, res) {
    return [
        tokens.method(req, res),
        tokens.url(req, res),
        tokens.status(req, res),
        tokens.res(req, res, 'content-length'),
        tokens['response-time'](req, res) + 'ms'
    ].join('\r\n') 
}, { stream: accessLogStream }));//讓每條自己設定的資訊換行顯示

那麼你的檔案出現是這樣的:

GET /index2.html
304

7.853ms

這就是morgan中介軟體的大致用法。
詳細用法還是看官方文件把。不過知道了這些,再來看官方文件就是so easy 了。