express框架的基本使用

112 阅读5分钟

认识web框架

nodejs中有http模块,我们可以使用内置的http模块来搭建服务器,为什么还要使用第三方框架呢?

内置的http模块搭建服务器有下面几个缺陷:

  1. 原生http在进行很多处理时,会较为复杂。
  2. 有URL判断,Method请求方法判断,参数处理,逻辑代码处理等,都需要我们自己来处理和封装,会较为麻烦。
  3. 如果所有的内容放在一起,会非常的混乱。

目前在Node中比较流行的web服务器框架是express、koa;

今天先学习一下express的基本使用。

  • 我们可以基于express快速、方便的开发自己的web服务器;
  • 并且可以通过一些实用工具和中间件来扩展自己的功能;

安装

express的使用方式有两种:

  1. 从零搭建express结构
  2. 使用express项目生成器,创建一个框架
// 方式一:
npm init -y
npm install express
​
// 方式二:
// 安装生成器
npm install -g express-generator
// 创建项目
express my-express-demo

创建服务器

// 导入express
const express = require("express");
​
// 创建服务器
const app = express();
​
app.post("/login",(req,res)=>{
    res.end("登录成功");
})
​
const HTTP_PORT = 8000;
// 开启服务器,监听端口
app.listen(HTTP_PORT,()=>{
    console.log("服务器开启");
});
​

认识中间件

express是一个路由和中间件的web框架,它本质上是一系列中间件函数的调用。

中间件是什么呢?

  • 中间件本质是传给express的一个回调函数。
  • 这个函数接受三个参数:请求对象(request)、响应对象(response)、next函数(执行下一个中间件的函数)

那么如何将一个中间件应用到express中呢?

这里有两种方式:

  • app(router).use
  • app(router).methods

methods是指常用的请求方法,比如:get,post,put,delete等。

app.use((request,response,next)=>{
    // 一系列操作
    next();
});
​
app.get("/login",(request,response,next)=>{
    // 一系列操作
})
自定义中间件

我们先来学习用use的用法应用中间件

案例一:最普通的中间件

通过use注册的中间件是最普通的中间件,无论那种请求方式它都能匹配上。

app.use((req, res, next) => {
  console.log('normal middleware 01')
  next();
})

案例二:path匹配的中间件

注册路径匹配的中间件是不会对请求方式进行限制的。

app.use('/home', (req, res, next) => {
  console.log('match /home middleware')
  next();
})

案例三:path和method匹配中间件

这中方式对路径和请求方式都有限制

// get请求方式
app.get("/home",(req,res,next)=>{
    console.log("mathch path and methods middleware");
    next()
})

案例四:注册多个中间件

// app.use(路径, 中间件1, 中间件2, 中间件3)
app.use('/home', (req, res, next) => {
  console.log('match /home get middleware01')
  next()
}, (req, res, next) => {
  console.log('match /home get middleware02')
  next()
}, (req, res, next) => {
  console.log('match /home get middleware03')
  next()
}, (req, res, next) => {
  console.log('match /home get middleware04')
})
express内置中间件

body解析

在客户端发送post请求时,会将数据放到body中,通过json形式传递或者通过form表单的方式传递。

我们可以使用express内置的中间件来解析。

// 解析json
app.use(express.json())
​
// 解析application/x-www-form-urlencoded
app.use(express.urlencoded({extended: true}))
​
app.post("/login",(req,res,next)=>{
    console.log(req.body); // 打印body的内容
    res.end("登录成功");
})

托管静态资源

app.use(express.static("./public")); // 静态资源都放在public目录下

想要了解更多,请查阅官方文档:www.expressjs.com.cn/starter/sta…

第三方中间件

记录日志中间件

安装:

npm install morgan
const morgan = require('morgan')
// 应用第三方中间件
const writeStream = fs.createWriteStream('./logs/access.log');// 写入的文件路径
app.use(morgan('combined', { stream: writeStream }))
​

上传文件中间件

安装:

npm install multer
const multer = require("multer");
​
const upload = multer({
  // dest: './uploads'
  storage: multer.diskStorage({
    destination(req, file, callback) {
      callback(null, './uploads')  // 保存的路径
    },
    filename(req, file, callback) {
      callback(null, Date.now() + '_' + file.originalname)  // 定义文件名称
    }
  })
})
// 编写中间件
// 上传单文件: singer方法
app.post('/avatar', upload.single('avatar') , (req, res, next) => {
  console.log(req.file)
  res.end('文件上传成功~')
})
​
// 上传多文件: 
app.post('/photos', upload.array('photos'), (req, res, next) => {
  console.log(req.files)
  res.end('上传多张照片成功~')
})
​

Express整个框架的核心就是中间件,理解了中间件其他一切都非常简单!

路由

express中路由的定义采用以下结构:

app.METHOD(PATH, HANDLER) 
// METHOD指的是请求方式:比如post,get,put,delete
模块化路由

为了方便对路由进行管理,Express不建议我们将所有的路由都写在在一个文件中。

我们可以将路由分类,将同一类的路由抽离为一个模块。比如下面的用户路由模块:

// user.router.js
const express = require("express");
// 用户模块
// 2.调用express.Rotuer()方法创建路由对象。
const userRouter = express.Router();
​
//3.在路由对象上挂载具体的路由。
userRouter.post("/",(req,res)=> res.end("新增了一个订单"));
userRouter.post("/edit",(req,res)=> res.end("修改了订单信息"));
userRouter.post("/del",(req,res)=> res.end("删除了一个订单"));
userRouter.get("/list",(req,res)=> res.end("查询所有的订单信息"));
​
//4.使用module.exprots导出路由对象
module.exports = userRouter;
// app.js
// 引入路由
const userRouter = require("./router/user.router.js");
// .....
// 注册路由
app.use("./user",userRouter);
// ......
获取传递的参数

客户端在传递参数的方式常见的是5种。

  1. 通过get请求中的URL的params(动态路由)
  2. 通过get请求中的URL的query(查询参数)
  3. 通过post请求中的body的json格式 (通过中间件解析)
  4. 通过post请求中的body的x-www-form-urlencoded格式(通过中间件解析)
  5. 通过post请求中的body的form-data格式(通过中间件解析)

这里我们看一下前面两种方式要怎么获取参数。

query参数

app.get("/login",(req,res)=>{
    console.log(req.query); // 使用req.query即可获取
    res.end("登录");
});

params参数

app.get("/login/:id/:name",(req,res)=>{
    console.log(req.params); // 使用req.query即可获取
    res.end("登录");
})
响应数据
  • end方法

    • 类似于http模块里面的response.end()方法,用法一致。
  • json方法

    • json方法中可以传入很多的类型:object、array、string、boolean、number、null等,它们会被转换成json格式返回;
  • status方法

    • 用于设置状态码;

以上,谢谢!