### 一.Node.js Express 框架
#### 1.Express 简介
Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP 工具。
使用 Express 可以快速地搭建一个完整功能的网站。
Express 框架核心特性:
1.可以设置中间件来响应 HTTP 请求。
2.定义了路由表用于执行不同的 HTTP 请求动作。
3.可以通过向模板传递参数来动态渲染 HTML 页面
#### 2.安装 Express
代码如下:
```
npm install express --save
```
1.在使用express的时候需要配合以下模块一起安装
body-parser - node.js 中间件,用于处理 JSON, Raw, Text 和 URL 编码的数据。
cookie-parser - 这就是一个解析Cookie的工具。通过req.cookies可以取到传过来的cookie,并把它们转成对象。
multer - node.js 中间件,用于处理 enctype="multipart/form-data"(设置表单的MIME编码)的表单数据。
代码如下:
```
npm install body-parser --save
npm install cookie-parser --save
npm install multer --save
```
2.第一个express框架案例,还是hello world
server.listen([port[, host[, backlog]]][, callback])可以有四个参数,后面三个为可选
代码如下:
```
//引入express模块
var express = require('express')
//等同于启动服务器
var app = express()
//等同于前面路由访问
app.get('/',(req,res)=>{
//返回数据,等同于前面的res.write和res.end
res.send('hello world')
})
//端口输出
var server = app.listen(8889,()=>{
//获取server的地址
var address = server.address()
console.log(address)
})
console.log("Server running at http://127.0.0.1:8889/")
```
执行node express.js运行结果得到下面结果

3.Express 应用程序生成器
http://www.expressjs.com.cn/starter/generator.html类似webpack生成框架可以参考
4.利用express来写路由
```
//引入express模块
var express = require('express')
//等同于启动服务器
var app = express()
//等同于前面路由访问
app.get('/',(req,res)=>{
//返回数据,等同于前面的res.write和res.end
res.send('hello world')
})
app.get('/a',(req,res)=>{
//返回数据,等同于前面的res.write和res.end
res.send('a')
})
app.get('/b',(req,res)=>{
//返回数据,等同于前面的res.write和res.end
res.send('b')
})
app.get('/c',(req,res)=>{
//返回数据,等同于前面的res.write和res.end
res.send('c')
})
app.listen(8889)
console.log("Server running at http://127.0.0.1:8889/")
```
5.获取静态文件
Express 提供了内置的中间件 express.static 来设置静态文件如:图片, CSS, JavaScript 等。你可以使用 express.static 中间件来设置静态文件路径
```
app.use('/public', express.static('public'))
```
首先启动服务器获取公共资源,代码如下
```
var express = require('express');
var app = express();
app.use('/public', express.static('public'));
app.get('/', function (req, res) {
res.send('Hello World');
}).listen(8889)
```
可以通过访问公共资源路径访问对应资源如下图

6.获取post和get请求参数
```
const express = require('express');
const app = express();
const bodyParser = require('body-parser');
// 创建 application/x-www-form-urlencoded 编码解析
const urlencodedParser = bodyParser.urlencoded({ extended: false })
//跳转路由到a/html
app.get('/a.html', function (req, res) {
//返回a的页面
res.sendFile( __dirname + "/" + "a.html" );
})
//通过post提交到/process_post
app.post('/process_post', urlencodedParser, function (req, res) {
// 输出 JSON 格式
const response = {
"first_name":req.body.first_name,
"last_name":req.body.last_name
};
console.log(response);
res.end(JSON.stringify(response));
})
app.listen(8081)
```
注意a.html代码
```
<html>
<body>
<form action="http://127.0.0.1:8081/process_post" method="POST">
First Name: <input type="text" name="first_name"> <br>
Last Name: <input type="text" name="last_name">
<input type="submit" value="Submit">
</form>
</body>
</html>
```
7.文件上传
注意multer 中间件的使用,参数为固定形式
```
//dest or storage: 上传的文件所存放的位置 ,array允许上传文件格式和几个
app.use(multer({ dest: '/tmp/'}).array('image',2));
```
具体文件上传的代码为下
```
var express = require('express');
var app = express();
var fs = require("fs");
var bodyParser = require('body-parser');
//上传文件的中间件,上传文件借助的工具
var multer = require('multer');
app.use('/public', express.static('public'));
app.use(bodyParser.urlencoded({ extended: false }));
//dest or storage: 上传的文件所存放的位置 ,array允许上传文件格式和几个
app.use(multer({ dest: '/tmp/'}).array('image',2));
app.get('/index.html', function (req, res) {
res.sendFile( __dirname + "/" + "index.html" );
})
app.post('/file_upload', function (req, res) {
console.log(req.files[0]); // 上传的文件信息
var des_file = __dirname + "/" + req.files[0].originalname;
fs.readFile( req.files[0].path, function (err, data) {
//文件写入的地方
fs.writeFile(des_file, data, function (err) {
if( err ){
console.log( err );
}else{
response = {
message:'File uploaded successfully',
filename:req.files[0].originalname
};
}
console.log( response );
res.end( JSON.stringify( response ) );
});
});
})
app.listen(8888)
```
上传文件信息 为下面代码,从而展现
```
{ fieldname: 'image',
originalname: 'logo.png',
encoding: '7bit',
mimetype: 'image/png',
destination: '/tmp/',
filename: '2db85c05f731fa2da349aa73d35940c6',
path: '\\tmp\\2db85c05f731fa2da349aa73d35940c6',
size: 6849 }
{ message: 'File uploaded successfully', filename: 'logo.png' }
```
8.Cookie 管理
util中间件的使用,通过中间件请求的cookie
```
// express_cookie.js 文件
var express = require('express')
var cookieParser = require('cookie-parser')
var util = require('util');
var app = express()
app.use(cookieParser())
app.get('/', function(req, res) {
console.log("Cookies: " + util.inspect(req.cookies));
})
app.listen(8081)
```