express的基本使用

概述

Express 是一个路由和中间件 Web 框架,其执行过程基本上是一系列中间件函数的调用。

如下,可使用 app.userapp.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

举报

© 著作权归作者所有


1