错误处理中间件
在程序执行的过程中,不可避免的会出现一些无法预料的错误,比如文件读取失败,数据库连接失败,错误处理中间件是一个集中处理错误的地方。
Express框架提供了错误处理中间件用来处理错误,程序在运行过程中一旦出错不能够再继续运行了,如果想要程序在出错以后还能够继续运行我们就需要在程序当中捕获错误加个错误处理,程序错误可以
大致分为两种一种是应用逻辑错误就是bug,这种错误是可以在开发阶段解决的。
程序在读取硬盘中某一个文件时这个文件不存在,程序也会报错。但是这种错误无法在开发阶段预料到,在程序运行过程中这种错误就需要被捕获,然后再对错误进行妥善处理才不会导致程序的崩溃。
这种错误包括要连接的数据库没有开启,都是一些预料之外的错误。
我们可以在每个程序要出错的地方进行判断,但是这样做会导致重复的代码增多。
在Express中提供了错误处理中间件,这是一个统一处理错误的地方。
app.use((err,req,res,next)=>{
res.status(500).send('服务器发送未知错误');
})
错误处理中间件和普通中间件相比它的参数函数有四个形参分别为错误对象,请求对象,响应对象和next方法。
在参数函数中可以对错误进行集中处理,比如上述代码中对客户端做出了响应,告诉客户端服务器这边发生了位置错误并且将HTTP状态码设置为500。客户端看到500这个状态码时就知道是服务器端出了问题。
当程序发生错误时候 错误处理中间件会被自动执行。
// 引入express框架
const express = require('express');
// 创建网站服务器
const app = express();
// 监听端口
// 错误处理中间件
// 当访问/index这个请求地址的时候,程序就会抛出一个错误
app.get('/index',(req,res)=>{
// 手动抛出错误
// 创建Error构建函数的实例就相当于创建了一个错误
throw new Error('程序发生了未知错误')
})
// 当程序抛出错误以后,会自动执行错误处理函数中间件
app.use((err,req,res,next)=>{
// 当服务器发生错误,状态码应该设为500
res.status(500).send(err.message);
})
app.listen(3000);
console.log('网站服务器启动成功')
当程序出现错误时,调用next()方法,并且将错误信息通过参数的形式传递给next()方法,即可触发错误处理中间件。
错误处理中间件只能捕获到同步代码执行出错,throw new Error('程序发生了未知错误')
实际上是一个同步代码,如果异步代码在执行过程中出现了错误,这个错误在错误处理中间件中是没有办法捕获到的,这时需要手动去触发错误代码中间件,当异步API出错时需要调用next方法并且将错误方法传递到next中就可以。
app.get("/", (req,res,next) =>{
fs.readFile("/file-does-not-exit",(err, data)=>{
if(err){
next(err);
}
});
});
文件读取失败:
// 引入express框架
const express = require('express');
// 创建网站服务器
const app = express();
const fs = require('fs');
// 错误处理中间件
// 当访问/index这个请求地址的时候,程序就会抛出一个错误
app.get('/index',(req, res, next) => {
// 手动抛出错误
// 创建Error构建函数的实例就相当于创建了一个错误
// throw new Error('程序发生了未知错误')
fs.readFile('./demo.txt','utf8',(err, result) => {
// 如果err对象为空 那文件读取成功
if(err != null){
next(err)
}else{
res.send(result)
}
})
// res.send('程序正常执行')
})
// 当程序抛出错误以后,会自动执行错误处理函数中间件
app.use((err,req,res,next)=>{
// 当服务器发生错误,状态码应该设为500
res.status(500).send(err.message);
})
// 监听端口
app.listen(3000);
console.log('网站服务器启动成功')
文件读取成功:
// 引入express框架
const express = require('express');
// 创建网站服务器
const app = express();
const fs = require('fs');
// 错误处理中间件
// 当访问/index这个请求地址的时候,程序就会抛出一个错误
app.get('/index',(req, res, next) => {
// 手动抛出错误
// 创建Error构建函数的实例就相当于创建了一个错误
// throw new Error('程序发生了未知错误')
fs.readFile('./01.js','utf8',(err, result) => {
// 如果err对象为空 那文件读取成功
if(err != null){
next(err)
}else{
res.send(result)
}
})
// res.send('程序正常执行')
})
// 当程序抛出错误以后,会自动执行错误处理函数中间件
app.use((err,req,res,next)=>{
// 当服务器发生错误,状态码应该设为500
res.status(500).send(err.message);
})
// 监听端口
app.listen(3000);
console.log('网站服务器启动成功')
错误处理中间件和普通中间件相比是有4个参数的,第一个参数是error对象,错误处理中间件默认情况下只能主动捕获到同步代码执行出错,如果异步代码执行出错,它是捕获不到的,这个时候需要手动执行next()方法,并且给next方法传递参数,它才能够去触发错误处理中间件。