Node.js学习笔记(七)#Express框架

目录

一、Express框架简介

二、安装和使用

1.安装

2.用express创建基本Web服务器

三、Express路由

1.路由概念

2.创建基本路由

①.创建一个简单的get路由

② 创建一个简单的post路由

3.路由模块化

①创建router.js文件

② 导入路由模块,并注册路由

③ 启动服务器,访问api

四.获取参数方式

1.获取url中查询字符串,并动态返回内容

① name为zhangsan时

② name为lisa时

2.获取url动态参数,并动态返回内容

五、Express中间件

1.中间件概念

2.中间件工作流程

 3.创建一个中间件

4.中间件使用

① 全局使用

② 局部使用

5.中间件注意事项

6.中间件分类

① 应用级别的中间件

② 路由级别的中间件

③ 错误级别的中间件

④ 内置中间件

⑤ 第三方中间件

六、搭建服务器

1.安装express

2.编写路由router.js

3.编写服务器server.js

4.启动服务器


一、Express框架简介

Express是基于Node.js平台,快速、开放、极简的 Web 开发框架。简单来说,Express作用与http模块类似,不仅保留了http的基本API,还额外封装了一些新方法,比起http模块开发效率更高。Express也提供了中间件功能,包含内置中间件、第三方中间件以及自定义中间件三种中间件,可用于拦截请求和响应,对请求和响应进行功能扩展。

二、安装和使用

1.安装

在当前项目目录中,终端运行如下命令:

npm install express

2.用express创建基本Web服务器

//1.导入Express
const express = require('express')
//2.创建Web服务器
const app = express()
//3.启动服务器
app.listen(8080,()=>{
    console.log('express is running at http://127.0.0.1:8080')
})

三、Express路由

1.路由概念

路由是指确定应用程序如何响应客户端对特定端点的请求,该端点是URI(或路径)和特定HTTP请求方法(GET、POST等)。

路由定义采用以下结构:

app.METHOD(PATH, HANDLER)
//app是express实例对象
//METHOD是HTTP请求方法,如get、post
//PATH是服务器路径
//HANDLER是回调处理函数

2.创建基本路由

①.创建一个简单的get路由

app.get("/user", (req, res) => { // 监听get请求'/user'
  // 返回JSON对象
  res.status(200).send({ name: "zhangsan", age: 20, height: 180 });
});

② 创建一个简单的post路由

app.post("/list", (req, res) => { //监听post请求'/list'
  // 返回成功信息
  res.send({ code: 200, message: "success" });
});

3.路由模块化

由于文件较大,不推荐路由直接挂载到app上,为了方便管理,我们抽离单独路由模块,调用express.Router()创建路由对象。

①创建router.js文件

// 1.导入express
const express = require("express");
// 3.调用express.Router()创建路由对象
const router = express.Router();
// 3.挂载get请求
router.get("/user", (req, res) => {
  res.status(200).send({ name: "zhangsan", age: 20, height: 180 });
});
// 4.挂载post请求
router.post("/list", (req, res) => {
  res.send({ code: 200, message: "success" });
});
// 5.导出路由对象
module.exports = router

② 导入路由模块,并注册路由

//1.导入Express
const express = require("express");
//2.创建Web服务器
const app = express();
//3.导入路由模块
const router = require("./router");
//4.注册路由模块,访问时带'/api'前缀
app.use('/api',router);
//5.启动服务器
app.listen(8081, () => {
  console.log("express is running at http://127.0.0.1:8081");
});

③ 启动服务器,访问api

四.获取参数方式

1.获取url中查询字符串,并动态返回内容

app.get("/getUser", (req, res) => {
  const { query } = req; // 获取req.query:解析url中的查询字符串,并返回一个对象
  let result = {};
  if (query.name == "zhangsan") { // 根据name动态返回信息
    result = { code: 200, message: "success" };
  } else {
    result = { code: 404, message: "failure" };
  }
  res.send(result);
});

① name为zhangsan时

② name为lisa时

2.获取url动态参数,并动态返回内容

app.get("/getBMI/:height/:weight", (req, res) => {
  const { params } = req; // 获取动态参数
  let bmi = params.weight / Math.pow(params.height / 100, 2); // 计算传入的动态参数
  let result = getBmi(bmi); // 调用获取bmi方法
  res.send(result); // 返回相应内容
});

function getBmi(bmi) { // 获取bmi
  if (bmi <= 18.4) {
    return { code: 200, message: "偏瘦", bmi: bmi };
  } else if (bmi > 18.4 && bmi < 24) {
    return { code: 200, message: "正常", bmi: bmi };
  } else if (bmi >= 24 && bmi < 28) {
    return { code: 200, message: "过重", bmi: bmi };
  } else if (bmi >= 28) {
    return { code: 200, message: "肥胖", bmi: bmi };
  } else {
    return { code: 404, message: "请输入正确内容" };
  }
}

五、Express中间件

1.中间件概念

中间件是工作在客户端和服务器之间的中间组件,主要用于拦截请求和响应,对请求和响应进行功能扩展的中间组件。

2.中间件工作流程

 3.创建一个中间件

const mw = function(req,res,next){
    console.log("我是一个中间件")
    next() //必须调用next(),表示流转关系转入下一个中间件或路由
}

4.中间件使用

① 全局使用

多个中间件之间,共享同一份 reg 和 res。基于这样的特性,我们可以在上游的中间件中,统一为 reg 或res 对象添加自定义的属性或方法,供下游的中间件或路由进行使用。

const mw = function (req, res, next) {
  req.createTime = new Date().toLocaleString(); //共享createTime
  next();
};
app.use(mw); // 注册全局中间件
app.get("/user", (req, res) => {
  res.send("创建时间为" + req.createTime); // 获取全局中间件createTime参数
});

注意:全局中间件可以有多个,按照注册顺序依次调用

app.use(function (req, res, next) {
  console.log("我是第一个全局中间件");
  next();
});
app.use(function (req, res, next) {
  console.log("我是第二个全局中间件");
  next();
});
app.get("/user", (req, res) => {
  res.send("调用/user");
});

② 局部使用

局部中间件挂载在路由中,只在当前路由接口生效

const mw = function (req, res, next) {
  req.createTime = new Date().toLocaleString(); //共享时间
  next();
};
app.get("/user", mw, (req, res) => {
  res.send("userApi创建时间为" + req.createTime); // 可以获取createTime
});
app.get("/id", (req, res) => {
  res.send("idApi创建时间为" + req.createTime); // 无法获取createTime,返回undefine
});

 挂载多个局部中间件 [mw1,mw2,etc] 或 mw1,mw2,etc

app.get("/user", [mw1, mw2, etc], (req, res) => {
  res.send("调用/user")
})
app.get("/user", mw1, mw2, etc, (req, res) => {
  res.send("调用/user")
})

5.中间件注意事项

①一定要在路由之前注册中间件

②客户端发送过来的请求,可以连续调用多个中间件进行处理

③执行完中间件的业务代码之后,不要忘记调用next()函数

④为了防止代码逻辑混乱,调用next()函数后不要再写额外的代码

⑤连续调用多个中间件时,多个中间件之间,共享req和res对象

6.中间件分类

官方将中间件分为五类

① 应用级别的中间件

通过app.use()、app.get()、app.post()等,绑定到app实例上的中间件,叫做应用级别的中间件。

应用级别的中间件可以调用next('route')跳到下一路由.注意:next('route')只作用于app.METHOD() 或router.METHOD()

app.get("/user/:id",function (req, res, next) {
    // 如果id为0则跳到下一个路由
    if (req.params.id === "0") next("route");
    // 否则控制权交给堆栈中的下一个中间件函数
    else next();
  },
  function (req, res, next) {
    // 返回regular
    res.send("regular");
  }
);
app.get("/user/:id", function (req, res, next) {
  // id为0时返回special
  res.send("special");
});

② 路由级别的中间件

绑定到express.Router()实例上的中间件,叫做路由级别的中间件。用法与应用级别中间件没有差别。

路由级别的中间件可以调用next('route')跳到下一路由

router.get('/user/:id', function (req, res, next) {
  // 如果id为0则跳到下一个路由
  if (req.params.id === '0') next('route')
   // 否则控制权交给堆栈中的下一个中间件函数
  else next()
}, function (req, res, next) {
  // 返回regular
  res.send('regular')
})
// id为0时返回special
router.get('/user/:id', function (req, res, next) {
  console.log(req.params.id)
  res.send('special')
})

③ 错误级别的中间件

用来捕获项目中发生的异常错误,防止项目异常崩溃的中间件叫做错误级别的中间件。

错误级别的中间件只能捕获前面路由的错误,一般放在最后注册使用,与其他中间件相反

app.get("/", function (req, res, next) {
  throw new Error("服务器异常");
  res.send("special");
});
const error = function (err, req, res, next) {// 只能捕获前面路由的错误,一般放在最后
  console.log(err.message);
  res.status(500).send(err.message);// 返回500 错误信息
};

④ 内置中间件

Express内置了三个常用中间件express.staticexpress.jsonexpress.urlencoded

1)express.static

作用:托管静态资源,如html、img、css等

具体步骤如下:

Ⅰ.创建file文件夹,并在文件夹中新建index.html

Ⅱ.托管静态文件

不挂载路径前缀访问

app.use(express.static("file"))

挂载路径前缀访问

app.use("/file", express.static("file"))

Ⅲ.访问静态资源

注意:如果要托管多个静态资源,需要多次调用express.static()函数。

访问静态资源时,会根据添加顺序来查找

2)express.json

作用:解析JSON格式数据

app.use(express.json())

3)express.urlencoded

作用:解析URL-encoded数据

app.use(express.urlencoded( extended:false ))

⑤ 第三方中间件

非Express官方内置的,而是第三方开发出来的中间件称为第三方中间件。使用第三方中间件需要先进行install下载,并导入对应的模块,最后调用app.use()注册使用。

e.g. cookie-parser

1)安装cookie-parser

npm install --save-dev cookie-parser

2)导入并注册使用 

const cookieParser = require("cookie-parser");
app.use(cookieParser());

3)设置cookie

res.cookies('key','value',option)

4)获取cookie

console.log(req.signedCookies['key'])

六、搭建服务器

1.安装express

npm install express

2.编写路由router.js

// 1.导入express
const express = require("express");
// 2.调用express.Router()创建路由对象
const router = express.Router();
// 3.挂载路由
router.get('/get',(req,res)=>{
    const {query} = req // get请求获取query
    res.send({
        status:200,
        message:"get success",
        data:query
    })
})
router.post('/post',(req,res)=>{
    const {body} = req // post请求获取body
    res.send({
        status:200,
        message:"post success",
        data:body
    })
})
// 4.导出路由对象
module.exports = router

3.编写服务器server.js

//1.导入Express
const express = require("express");
//2.创建Web服务器
const app = express();
//3.注册urlencoded中间件,获取post请求体
app.use(express.urlencoded({extended:false}))
//4.导入路由对象
const router = require("./router");
//5.挂载路由
app.use('/api',router);
//6.启动服务器
app.listen(8081, () => {
  console.log("express is running at http://127.0.0.1:8081");
});

4.启动服务器

在server.js上级目录下运行该命令

node server

猜你喜欢

转载自blog.csdn.net/weixin_42214717/article/details/128220115