express的基本使用
概述
Express 是一个路由和中间件 Web 框架,其执行过程基本上是一系列中间件函数的调用。
如下,可使用 app.user
、app.get
...等方法定义中间件;Express收到请求中后,会逐个执行所有中间件,类似于过滤器;
// 定义日志和输出级别
app.use(logger('dev'));
// Express的中间件,用来实现cookie的解析
app.use(cookieParser());
// 定义静态文件目录
app.use(express.static(path.join(__dirname, 'public')));
// 设置该中间件只在请求路径为"/user"时执行
app.use('/user', function (req, res, next) {
console.log('Request Type:', req.method);
next(); // 执行next()使用Express继续向后执行下一个中间件
});
// 设置该中间件只在请求路径为"/list"时执行
app.get('/list', function (req, res, next) {
res.send('USER');
});
中间件函数能够访问请求对象 (req
)、响应对象 (res
) 以及应用程序的请求/响应循环中的下一个中间件函数。下一个中间件函数通常由名为 next
的变量来表示。
中间件函数可以执行以下任务:
- 执行任何代码。
- 对请求和响应对象进行更改。
- 结束请求/响应循环。
- 调用堆栈中的下一个中间件函数。
如果当前中间件函数没有结束请求/响应循环,那么它必须调用 next()
,以将控制权传递给下一个中间件函数。否则,请求将保持挂起状态。
中件间类型
中间件中的请求和响应对象
中间件响应对象的常见方法:
## 设置HTTP状态码为403,并在没有任何响应数据的情况下直接结束请求
res.status(403).end();
## 设置HTTP状态码为400,并直接返回响应内容(响应内容可以是字符串、数组、boolean等)
res.status(400).send('Bad Request')
## 重定向请求
res.redirect(301, 'http://example.com')
## 将字符串以HTML的方式发送到客户端
res.render('index')
## 返回JSON
let result = {
"test":"test"
}
res.json(result);
## 返回一个文件至客户端
res.sendFile(path.join(__dirname, '../views/test.html'));
应用层中间件
1.0> 如下是不做限定的中间件,任何请求都会经过它
app.use(function (req, res, next) {
console.log('Time', Date.now());
next();
})
2.0> 如下是限定请求路径的中间件,只有请求路径符合规则才能匹配到这个中间件;
app.get('/user/:id', (req, res) => {
console.log('Request Type', req.method); // GET
next();
})
# app.use() 可以接收任何类型的请求
# app.get() 只能接收get请求
# app.post() 只能接收post请求
# req.body 取出请求体中的参数
# req.query 取出url上的拼接参数
# req.params 取出restfull风格的参数
3.0> 可以在一个中间件中配置多个处理函数;其中的next是往下一个函数,找到最后一个处理函数的时候再跳到下一个中间件;
也可以给同一个路径定义多个中间件,可以用next()
跳到下一个中间件,但是对于处理同一个路径的中间件,不能发送多个响应;
app.get('/user/:id', (req, res, next) => {
if (req.params.id === '0') next('route'); ## next('route') 用于直接执行下一个中间件
else next(); ## next()用于跳到一下函数或中间件
}, function (req, res, next) {
res.send('normal');
})
app.get('/user/:id', function (req, res, next) {
res.send('special');
}
注意:next('route')
仅在使用app.METHOD()
或router.METHOD()
函数加载的中间件函数有效(app.use
不行);
跨域配置
// 设置全局响应头
app.use((req, res, next) => {
res.header('Access-Control-Allow-Origin', '*')
res.header('Access-Control-Allow-Headers', 'Authorization,X-API-KEY, Origin, X-Requested-With, Content-Type, Accept, Access-Control-Request-Method' )
res.header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PATCH, PUT, DELETE')
if(req.method === 'OPTIONS'){
res.status(204).end();
}else{
next();
}
});
官方文档:https://expressjs.com/zh-cn/guide/using-middleware.html