node学习—express中间件

一、express中间件

1、next( )

在这里插入图片描述

这里的(req, res, next) => {}就是一个中间件,可将前一个next()交给后续执行

const express = require('express');
const app = express(); //创建一个express应用,app实际上是一个函数,用于处理请求的函数
app.get("*", (req, res, next) => {
  console.log("handler1");
  next();
}, (req, res, next) => {
  console.log("handler2");
  next();
});
app.get("*", (req, res, next) => {
  console.log("handler3");
  next();
});

const port = 5108;
app.listen(port, () => {
  console.log(`server listen on ${port}`);
});

由于移交最后一个处理时并没有,express验证到并没有end()结束,所以发送404.
在这里插入图片描述
在这里插入图片描述
如果某过程结束了响应

const express = require('express');
const app = express(); //创建一个express应用,app实际上是一个函数,用于处理请求的函数
app.get("/news", (req, res, next) => {
  console.log("handler1");
  res.status(200);
  res.end('响应消息');
  next();
}, (req, res, next) => {
  console.log("handler2");
  next();
});
app.get("/news", (req, res, next) => {
  console.log("handler3");
  next();
});

const port = 5108;
app.listen(port, () => {
  console.log(`server listen on ${port}`);
});

在这里插入图片描述
在这里插入图片描述
后续函数还是会执行,但无法再设置请求头

const express = require('express');
const app = express(); //创建一个express应用,app实际上是一个函数,用于处理请求的函数
app.get("/news", (req, res, next) => {
  console.log("handler1");
  // throw new Error('错误信息');
  //相当于 next(new Error("错误信息"));
  next(new Error('错误信息'));//发生错误
}, (req, res, next) => {
  console.log("handler2");
  next();
});
app.get("/news", (req, res, next) => {
  console.log("handler3");
  next();
});

const port = 5108;
app.listen(port, () => {
  console.log(`server listen on ${port}`);
});

如果中间件发生了错误,服务器不会停止,而是会寻找后续的错误处理中间件;如果没有找到,则响应500
在这里插入图片描述
在这里插入图片描述
如果找到

const express = require('express');
const app = express(); //创建一个express应用,app实际上是一个函数,用于处理请求的函数
app.get("/news", (req, res, next) => {
  console.log("handler1");
  // throw new Error('错误信息');
  //相当于 next(new Error("错误信息"));
  next(new Error('错误信息'));
}, (err,req, res, next) => {//错误处理中间件
  console.log("handler2");
  res.send("服务器错误");
  next();
});
app.get("/news", (req, res, next) => {
  console.log("handler3");
  next();
});

const port = 5108;
app.listen(port, () => {
  console.log(`server listen on ${port}`);
});

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、处理错误中间件

//errorMiddleware.js
// 处理错误的中间件
module.exports = (err, req, res, next) => {
  if (err) {
    const errObj = {
      code: 500,
      msg: err instanceof Error ? err.message : err,
    };
    //发生了错误
    res.status(500).send(errObj);
  } else {
    next();
  }
};
const express = require('express');
const app = express(); //创建一个express应用,app实际上是一个函数,用于处理请求的函数
app.get("/news", (req, res, next) => {
    console.log("handler1");
    // res.status(200);
    // res.end('响应消息');
    // throw new Error('错误信息');
    //相当于 next(new Error("错误信息"));
    next(new Error('错误信息'));
  }, 
  require('./errorMiddleware')
);
app.get("/news", (req, res, next) => {
  console.log("handler3");
  next();
});

const port = 5108;
app.listen(port, () => {
  console.log(`server listen on ${port}`);
});

在这里插入图片描述
实际上我们一般在use中使用中间件

const express = require('express');
const app = express(); //创建一个express应用,app实际上是一个函数,用于处理请求的函数
app.get("/news", (req, res, next) => {
    console.log("handler1");
    // res.status(200);
    // res.end('响应消息');
    // throw new Error('错误信息');
    //相当于 next(new Error("错误信息"));
    next(new Error('错误信息'));
});
app.get("/news", (req, res, next) => {
  console.log("handler3");
  next();
});
app.use("/news",require('./errorMiddleware'));
const port = 5108;
app.listen(port, () => {
  console.log(`server listen on ${port}`);
});

因为app.use("/news",require('./errorMiddleware'))可以匹配/news/news/abc等,匹配的范围更广,所以通用的处理可以使用use,不写就是通用匹配。

// 处理错误的中间件
module.exports = (err, req, res, next) => {
  console.log(req.baseUrl);//可以获取基地址
  if (err) {
    const errObj = {
      code: 500,
      msg: err instanceof Error ? err.message : err,
    };
    //发生了错误
    res.status(500).send(errObj);
  } else {
    next();
  }
};

二、常用中间件

1、express.static()

const express = require('express');
const app = express(); //创建一个express应用
const path = require("path");
const staticRoot = path.resolve(__dirname,"../public");

/**
 * 下面这段代码的作用:
 * 当请求时,会根据请求路径(req.path),从指定的目录中寻找是否存在该文件,如果存在,直接响应文件内容,而不再移交给后续的中间件
 */
app.use(express.static(staticRoot));
app.get("/css/index.css",(req,res)=>{
  console.log('css出现');
})
app.use(require('./errorMiddleware'));
const port = 5108;
app.listen(port, () => {
  console.log(`server listen on ${port}`);
});

在这里插入图片描述
因为不再移交给后续中间件,所以并没有输出css出现
在这里插入图片描述

const express = require('express');
const app = express(); //创建一个express应用
const path = require("path");
const staticRoot = path.resolve(__dirname,"../public");

/**
 * 下面这段代码的作用:
 * 当请求时,会根据请求路径(req.path),从指定的目录中寻找是否存在该文件,如果存在,直接响应文件内容,而不再移交给后续的中间件
 * 如果不存在文件,则直接移交给后续的中间件处理
 * 默认情况下,如果映射的结果是一个目录,则会自动使用index.html文件
 */
// app.use(express.static(staticRoot));
app.use("/static",(req,res)=>{
  console.log(req.baseUrl,req.path);
});
const port = 5108;
app.listen(port, () => {
  console.log(`server listen on ${port}`);
});

在这里插入图片描述
在这里插入图片描述

2、express.json()

const express = require('express');
const app = express(); //创建一个express应用
const path = require("path");
const staticRoot = path.resolve(__dirname,"../public");

app.use(express.static(staticRoot));
app.use(express.urlencoded({
  extended: true
}))

app.post("/api/student",(req,res)=>{
  console.log(req.body);
})

app.use(require('./errorMiddleware'));
const port = 5108;
app.listen(port, () => {
  console.log(`server listen on ${port}`);
});

在这里插入图片描述
在这里插入图片描述

3、express.json()

const express = require('express');
const app = express(); //创建一个express应用
const path = require("path");
const staticRoot = path.resolve(__dirname,"../public");

app.use(express.static(staticRoot));
// app.use(express.urlencoded({
//   extended: true
// }));
app.use(express.json());

app.post("/api/student",(req,res)=>{
  console.log(req.body);
})

app.use(require('./errorMiddleware'));
const port = 5108;
app.listen(port, () => {
  console.log(`server listen on ${port}`);
});

在这里插入图片描述
在这里插入图片描述
博主开始运营自己的公众号啦,感兴趣的可以关注“飞羽逐星”微信公众号哦,拿起手机就能阅读感兴趣的文章啦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飞羽逐星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值