在程序执行过程中,不可避免会出现一些错误,比如文件读取失败,数据库连接失败。
在中间件中,是由上到下依次执行的,如果遇到一处错误,则不会继续向下执行中间件。
错误处理中间件是一个集中处理错误的地方。
如何定义错误处理中间件?
它有四个参数,分别是错误对象,请求对象,响应对象,和next方法,在该函数内部可以对错误进行集中处理。
app.use((err,req,res,next) => {
res.status(500.send('服务器发生未知错误'));
})
实际操作代码示例:
// 引入express框架 返回一个方法
const express = require('express');
// 调用express创建网站服务器,创建app变量接收
const app = express();
app.get('/index',(req,res) => {
// 手动创建一个错误信息
throw new Error('程序发生了未知错误');
// 如果正常执行,没有错误,则不会执行错误处理中间件
res.send('输出页面')
})
// 定义错误处理中间件
app.use((err,req,res,next) => {
// 参数err下的message保存的就是错误信息
res.status(500).send(err.message);
})
// 监听端口
app.listen(3000);
console.log('网站服务器启动成功');
执行结果如下:
没出错的情况下:
出错的情况下:
但有个问题,错误处理中间件只能捕获到同步代码执行出错,上面代码中的throw new Error(‘程序发生了未知错误’);就是同步代码。
如果异步代码在执行过程中出错,错误处理中间件是无法捕获到的。
因此要手动去触发这个错误处理中间件,调用next方法,并将错误信息传递到next方法中即可。
实际操作代码示例:
// 引入express框架 返回一个方法
const express = require('express');
const fs = require('fs');
// 调用express创建网站服务器,创建app变量接收
const app = express();
app.get('/index',(req,res,next) => {
fs.readFile('./01.text','utf8',(err,doc) => {
// 如果err为空则读取成功,反之err为对象则读取失败
if(err != null){
next(err)
}else {
res.send(doc);
}
})
})
// 定义错误处理中间件
app.use((err,req,res,next) => {
// 参数err下的message保存的就是错误信息
res.status(500).send(err.message);
})
// 监听端口
app.listen(3000);
console.log('网站服务器启动成功');
执行结果如下:
因为01.text文件没有找到,所以输出错误: