express
基于 Node.js 平台,快速、开放、极简的 web 开发框架。
express
express helloworld
- 初始化项目(请确保你安装了node)
1 2 3 4 5 6
| mkdir demo cd demo # 初始化 package.json 一路回车 npm init # 安装express 我的是4.16.3版本 npm install express --save
|
- 创建server.js
1 2 3 4 5 6 7 8 9 10
| var express = require('express'); var app = express();
app.get('/', function(req, res){ res.send('hello world'); });
app.listen(8001,()=>{ console.log('port 8001 is listening!') });
|
开启服务器 node server.js
浏览器访问 localhost:8001
参数信息
请求url为 http://localhost:8001/?name=22
1 2 3 4 5 6 7 8 9 10
| app.get('/', function(req, res){ //获取请求方式 console.log(req.method) //请求参数为 k/v形式 console.log(JSON.stringify(req.query)); //根据url取参数 console.log(req.query.name); //返回数据 return res.json({code:0}) });
|
restful风格的匹配参数
restful风格 http://localhost:8001/aa/18/man
1 2 3 4 5 6
| app.get('/:name/:age/:gender', function(req, res){ console.log(req.params.name); console.log(req.params.age); console.log(req.params.gender); return res.json({code:0}) });
|
获取请求头和设置响应头
- request.get()
- response.set()
1 2 3 4 5 6
| // 获取请求头 和设置响应头 app.get('/', function(req, res){ console.log(req.get('Accept')); res.set('token','fdsalkjljjfadslkjfds') return res.json({code:0}) });
|
设置json格式的响应类型
- res.json({code:0})
- 麻烦的方式 先设置Content-Type 在去调对象序列化字符串
1 2 3 4
| // 响应json格式 app.get('/', function(req, res){ return res.json({code:0}) });
|
1 2 3 4 5
| // 响应json格式 app.get('/', function(req, res){ res.set('Content-Type','application/json;charset=utf-8') return res.send(JSON.stringify({code:0})) });
|
设置状态码
get && post
1 2 3 4 5 6 7
| app.get('/', function(req, res){ return res.json({code:0}) });
app.post('/', function(req, res){ return res.json({code:0}) });
|
app.use()
可以直接包含 get、post 等的匹配就不用同一路径分开写了 app.get(‘/user’,[args…]) app.post(‘/user’,[args..])
1 2 3 4 5 6 7 8 9
| var express = require('express');
app.use('/',(req,res,next)=>{ res.json({msg:"use"}) })
app.listen(8001,()=>{ console.log('port 8001 is listening!') });
|
中间件
类似promise里的 .then().then().then() 的加工处理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| var express = require('express'); var app = express();
// const Router = express.Router();
app.use('/',mod1,mod2)
function mod1(req,res,next){ console.log('进入 mod1 厂房') return next(); }
function mod2(req,res,next){ console.log('进入 mod2 厂房') res.json({msg:'数据返回结束'}) }
app.listen(8001,()=>{ console.log('port 8001 is listening!') });
|
use使用中间件的方式
1 2 3
| app.use('/',mod1,mod2) app.use('/',[mod1,mod2]) app.use('/',[mod1],mod2)
|
处理过程中通过req携带参数
1 2 3 4 5 6 7 8 9 10 11 12 13
| app.use('/',mod1,mod2)
function mod1(req,res,next){ console.log('进入 mod1 厂房') req.user = {name:"fsafsdfas"}; return next(); }
function mod2(req,res,next){ console.log('进入 mod2 厂房') console.log(JSON.stringify(req.user)) res.json({msg:'数据返回结束'}) }
|
next() 控制流程
- 不传递参数就会进入下一个中间件
- 传递Error对象 就会走进错误的处理分支
- 传递字符串 也会进入错误的处理分支 但是获取不到错误信息
- 传递字符串除非你是’route’ 否则都会进入错误分支
1 2 3 4
| next() next(new Error('fdsfdsa')) next('fdsafsa') next('route')
|
中间件的兜底处理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| var express = require('express'); var app = express();
app.use('/',mod1,mod2)
function mod1(req,res,next){ console.log('进入 mod1 厂房') return next(new Error('少了一个零件,请求召回')); }
function mod2(req,res,next){ console.log('进入 mod2 厂房') res.json({msg:'数据返回结束'}) }
//兜底处理 app.use((err,req,res,next)=>{ res.status(401) res.json({code:-1,msg:err.message}) })
app.listen(8001,()=>{ console.log('port 8001 is listening!') });
|
处理请求体 body-parser
安装 body-parser
1
| npm install body-parser --save
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| var express = require('express'); var app = express();
const bodyParser = require('body-parser');
app.use(bodyParser.urlencoded({extended:false}))
app.use('/',mod1,mod2)
function mod1(req,res,next){ //打印解析后的请求体 console.log(req.body) console.log('进入 mod1 厂房') return next() // return next(new Error('少了一个零件,请求召回')); }
function mod2(req,res,next){ console.log('进入 mod2 厂房') res.json({msg:'数据返回结束'}) }
app.use((err,req,res,next)=>{ res.status(401) res.json({code:-1,msg:err.message}) })
app.listen(8001,()=>{ console.log('port 8001 is listening!') });
|