一、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}`);
});
博主开始运营自己的公众号啦,感兴趣的可以关注“飞羽逐星”微信公众号哦,拿起手机就能阅读感兴趣的文章啦!