开头先说写无关的话: 看了很多技术博客,最痛恨的就是那种拷贝粘贴党,要么就是那种原文翻译混乱党, 都是属于无脑型。
不仅如此,格式也是让人心生绝望。浪费了很多时间。
当然有些人写这些只是给自己记的笔记,自己也不能太过激。
好了,牢骚发过了,现在写正题。
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
打开浏览器输入
http://localhost:1338/index2.html
看看你的node.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
3047.853ms
这就是morgan中间件的大致用法。
详细用法还是看官方文档把。不过知道了这些,再来看官方文档就是so easy 了。