简单的说web服务器要作的事情就是读取请求-->写入响应,根据http协议,请求的数据包括请求行、请求头(headers)和请求体,响应的数据包括响应头、响应行(headers)和响应体,咱们也就须要跟上面这几类数据打交道了,http复杂的地方在于headers的规则比较多。web框架的做用就是帮助咱们更好的读取请求和设置响应。node
express最重要的概念就是中间件,核心的api为:app.use(<中间件函数>)
,express应用处处都是use的使用。甚至能够说express就是一个中间件的库。 请求进来后通过一个个中间件函数的“加工”,在任何一个“加工”过程均可以完成响应,或者使用next()进入下一个中间件,看看官方的hello world示例:git
const express = require('express')
const app = express()
const port = 3000
app.get('/', (req, res) => res.send('Hello World!'))
app.listen(port, () => console.log(`Example app listening at http://localhost:${port}`))
复制代码
你会发现为啥没有使用use中间件,不是说express处处都是use吗?其实这段代码至关于这样写:github
const express = require('express')
const app = express()
const port = 3000
app.use((req, res) => {
if(req.path === "/" && req.method === "GET") {
res.send('Hello World!')
}
})
app.listen(port, () => console.log(`Example app listening at http://localhost:${port}`))
复制代码
app.get()
也只是一个语法糖,若是你没有发现express就是一个中间件的库,大概是由于里面基于app.use的语法糖太多了,例如app.post()、app.route()等等。其实express中基于路由的封装,自己就是在中间件的基础上加了一层请求路径的处理和判断。web
不少基于express的库,只要是经过use调用的,都是返回一个中间件。例如express自带的express.staticexpress
app.use(express.static(path.join(__dirname, 'public')));
复制代码
express.static() 返回值或许能够长这样(纯粹瞎猜的):json
(req, res, next) => {
if(请求路径匹配) {
// 读取文件并响应
} else {
next()
}
}
复制代码
中间件的模式很方便往应用中加功能,也有利于的第三方开发者丰富express生态。api
下面大概看一遍express的api文档并记录重要的知识点。promise
将数据解析成json的中间件, 如application/json类型,它是json字符串,最终会被解析成json浏览器
express.urlencoded()
: 处理像application/x-www-form-urlencoded类型(该类型是以key=xxx&name=111的形式传输)的数据,解析成对象缓存
express.raw()
:解析请求体为Buffer,
express.text()
: 解析请求体为字符串,
总结: 上面的接口都是处理请求主体的数据,它会根据请求的content-type来决定是否处理。例如express.json()默认解析content-type为“application/json”的请求,若是content-type为“application/json”可是请求体是个普通字符串,这样就会解析出错。另外请求的数据是以流的形式传输,使用这类中间件就能够直接在request.body中获得须要的数据。不然则只能手动读取流数据,再进行解析。
注意点:若是访问文件不存在,则会转给后面的请求处理中间件:
const express = require('express')
const app = express()
app.use(express.static('static'))
app.use((request, response, next) => {
response.end('hi')
next()
})
app.listen(3000, () => console.log(`App listening on port 3000!`))
复制代码
上面代码访问文件不存在仍是会返回hi,存在则返回文件。再次体会中间件的魅力
app.set (可设置模板引擎 )
app.get (app.set设置的值)
app.locals 全局变量
app.use
app.post/app.put/app.get 等等
app.on('mount', ()=>{})
大多数属性只是获取请求中直接能拿到的信息,只是express简单帮你加工判断一下,好比req.baseUrl、req.body、req.cookies、req.hostname、req.method、req.query等等。 须要注意几个:
location 重定向配合301状态码
format 根据请求的accept来响应不一样的数据
attachment 帮你设置Content-Disposition响应头,实现下载
send一次性发送 / write流的方式写
写的比较粗略,后面用到再慢慢补充吧
其它文章: