'express总结'

1.Express介绍

Express是一个简洁、灵活的node.js Web应用开发框架,是目前最流行的Node.js的Web开发框架,它提供一系列强大的功能,比如:

  • 模板解析(render())
  • 静态文件服务(express.static())
  • 中间件(app.use())
  • 路由控制(express.Router)

    2. 使用express

    本地安装
    1
    $ npm install express

获取、引用 通过变量app我们就可以调用express的各种方法

1
2
3
let express = require('express')
let app = express();
app.listen(port)

? express本质上是什么,是如何工作的呢?

3. get请求

根据请求路径来处理客户端发出的GET请求 语法

1
app.get(path,(req,res)=>{})

  • 第一个参数path为请求的路径
  • 第二个参数为处理请求的回调函数,有两个参数分别是
    • request 请求信息
    • response 响应信息
      1
      2
      3
      4
      5
      6
      7
      8
      9
      let express = require('express')'
      let app = express();
      app.get('/',(req,res)=>{
      res.end('welcome to Home!')
      })
      app.get('/list'/(req,res)=>{
      res.end('welcome to List');
      })
      app.listen(3000);

4. curl客户端使用方法

  • 可以用 postman APIs请求模拟发送
  • 指定请求头

    1
    $ curl -H 'content-type:application/json;charset=utf8' http://localhost:8888
  • 指定方法名

    浏览器的地址行不能发送出post请求

    1
    $ curl -X POST http://loaclhost:8000/user
  • 指定请求体

    1
    curl --data "name=zfpx&age=8" http://loaclhost:8000/user

    all

    app.all()可以匹配所有的HTTP动词 路由中的星号能匹配所有的路径

    1
    app.all(path,(req,res)=>{})

实例:

1
2
3
4
5
let express = require('express');
let app = express();
app.all('*',(req,res)=>{
send(404)
})

6. 获取请求参数

  • req.host 返回请求头里取的主机名(不包含port)
  • req.path URL的路径名
  • req.query

    7. 获得查询字符串

    1
    2
    3
    4
    // http://localhost:3000/?a=1&&c=3
    app.get('/',(req,res)=>{
    res.send(req.query)
    })

8. params路径参数

req.params 可以用来获取请求URL中的参数值

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
app.get(/:aid/:name,(req,res)=>{
res.send(req.params.id + '' + req.params.name)
})
//http://localhost:3000/6/wang
//params = {aid:6,name='wang'}
```
## 9. 中间件
中间件就是处理HTTp请求的函数,用来完成各种特定的任务,比如检查用户是否登录,检测用户是否有访问权限等,它的特点是:
- 一个中间件处理完请求和响应可以把响应数据再传递给下一个中间件
- 回调函数next参数,表示接受其他中间件的调用,函数体中的next()表示将请求数据传递给下一个中间件
- 还可以根据路径来区分进行返回执行不同的中间件
```$xslt
let express = require('express');
let app = rexpress();
let path = require('path');
app.use((req,res,next)=>{
res.setHeader('Content-Type','text/plain;charset=utf8);
next()
})
app.get('/',(req,res)=>{
res.end('首页');
})
app.get('/list/,(req,res)=>{
res.end('这是列表页');
})
app.listen(3000)

10. send

send()想浏览器发送一个响应信息,并可以智能处理不同数据类型的,并在输出响应时会自动进行一些设置,比如HEAD信息, HTTP缓存处理不同类型的数据.语法:

1
res.send([resBody|status],[body])

  1. 实例一: 当参数为一个String时,Content-Type默认设置为’text/html’.

    1
    res.send('Hello World'); // Hello World
  2. 当参数为Array或Object时,Express会返回一个JSON

    1
    2
    res.send({user:'tobi'}) // {"user":"tobi"}
    res.send([1,2,3]) //[1,2,3]
  3. 当参数为一个Number时, 并且没有上面提到的任何一条在响应体力,Express会 帮你设置一个响应体,比如:200会返回字符串”OK”

    1
    2
    3
    res.send(200); //OK
    res.send(404); //NOT FOUND
    res.send(500); //Internal Server Error
  4. 可以查看statusCode所对应的状态类型

    1
    require('_http_server').STATUS_CODES

11. 模板

在nodejs中使用expres框架,它默认的是ejs和jade渲染模板

11.2使用模板

使用ejs模板 -> 默认指向views文件夹

1
2
3
4
5
//指定渲染模板文件的后缀名为ejs
app.set('view engine','html');
app.set('views',path.join(__dirname,'views'))
app.set('index');

模板使用html后缀

1
2
3
4
5
//指定渲染模板文件的后缀名为html
app.set('views','view');
app.set('view engine','html');
app.set('html','require('ejs').__express');

11.3渲染视图

语法:

1
res.render(view,{...locals},callback)

  • 参数view就是模板的文件名
  • 在渲染模板时将自定义的data对象和在中间件中定义的locals对象,使用Object.assign(obj1,locals)合并后的属性集作为模板变量值传入
  • callback 用来处理返回的渲染后的字符串

    11.4 模板原理

    1
    2
    3
    4
    5
    6
    let tmp1 = `<h1>{{name}}</h1><h1>{{age}}</h1>`
    let data = {name:'wang',age:18};
    let html = tmp1.replace(/\{\{(\w+)\}\}/g,function(input,group){
    return data[group];
    })
    console.log(html); //`<h1>wang</h1><h1>age</h1>`

12. 静态文件服务器

如果要在网页中加载静态文件(css,js,img),就需要另外指定一个存放静态文件的目录,当浏览器发出非HTML文件请求时,服务器端就会到这个目录下去寻找相关文件

1
2
app.use(express.static(path.join(__dirname,'/')))
app.use(express.static('public'))

13. 重定向

redirect 方法允许网址的重定向

1
res.redirect([status],url);

实例:

1
res.redirect('http://www.baidu.com')

14. POST 请求

post 方法根据请求路径来处理客户端发出的Post请求 语法:

1
app.post(path,(req,res)=>{})

示例:

1
2
3
4
5
let bodyParser = require('body-parser');
app.use(bodyParser.urlencoded({extented:true}));
app.post('/login',(req,res)=>{
console.log(req.body.username)
})

16. 中间件的原理

1
2
3
4
5
6
7
8
9
10
11
12
let app = (req,res) =>{
let index = 0;
function next(){
let fn = app.routes[index++];
if(typeof fn ==='function') fn(req,res,next);
}
next();
}
app.routes =[];
app.use = (fn){
app.routes.push(fn);
}

17.params原理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//path为路由的路径
let path = '/users/:name/:age
//客户端发送的url
let url = '/users/wang/18';
let paramKeys =[];
let regStr - path.replace(/:(\w+)/g,(matchedStr,group1){
paramKeys.push(group1)
return '(\\w+)';
})
console.log(regStr); // /users/(\w+)/(\w+)
let reg = new RegExp(regStr); // /\/users\/(\w+)\/(\w+)/
let result = url.match(reg);
//[ '/users/zfpx/8', 'zfpx', '8', index: 0, input: '/users/zfpx/8' ]
let params = {};
for(let i = 0;i<paramKeys.length;i++){
params[paramKeys[i] = result[i+1];
}
console.log(params); //{'name':'wang','age':18}