node.js

关注公众号 jb51net

关闭
首页 > 网络编程 > JavaScript > node.js > node throw异常处理

nodejs中使用throw进行异常处理的操作方法

作者:胖虎拽

最近在写一个nodejs项目时在思考一个问题: 在方法调其他方法的过程中,其他方法是采用return来返回特定格式的错误数据还是使用throw来直接抛出错误?所以本文给大家介绍了nodejs中使用throw进行异常处理的操作方法,需要的朋友可以参考下

使用return来返回特定格式的错误数据

用例子来解释一下,如下代码所示:

// 一个校验数据的方法(采用return来返回特定格式数据的方式)
const validateData = (data) => {
    if (!data.name) {
        return { pass: false, message: '名称不能为空' }  
    }
}

// 一个提交数据的方法,在其中调用校验方法
const submit = (data) => {
    const res = validateData(data);
    if (!res.pass) {
        // 提示用户错误信息
        alert(res.message);
    }
}

submit({ name: '' });

在上面的代码中,validateData方法使用return返回特定格式的数据,在提交数据之前调用validateData方法校验数据,校验不通过将错误信息提示给用户。

上面这个例子是在前端项目中经常会遇到的一种情况,但是在后端项目中,重点并不是提示用户错误信息,而是在接口中以特定格式返回错误信息,例如:

// 一个校验数据的方法(采用return来返回特定格式数据的方式)
const validateData = (data) => {
    if (!data.name) {
        return { pass: false, message: '名称不能为空' }  
    }
}

// 一个在数据库表中新增一行数据的方法,在其中调用校验方法,return返回的数据将会作为接口的返回数据
const addRow = (data) => {
    const res = validateData(data);
    if (!res.pass) {
        return { code: -1, message: res.message }
    }
    // 数据库中新增数据
}

addRow({ name: '' });

在上面的代码中,通过两层return来返回数据;在只有两层时还好维护这样的代码,但是当后端代码处理的业务非常复杂,方法调用层级非常深后就会变得难以维护,因为每一层方法都要判断下一层的返回然后再处理结构后返回给上一层。那我就在想如何更简单呢?想到了直接使用throw来抛出错误。

使用 throw 来抛出错误

在后端项目代码中,主要是处理业务逻辑然后将结果通过接口返回,不像前端项目代码中有一部分业务逻辑还有用户交互。所以完全可以添加一个中间件,处理代码中抛出的所有错误然后封装后返回给接口调用方。例如在nodejs项目中:

// app.js文件
import 'express-async-errors'; // 引入这个模块后能捕获未被处理的异步报错并传递给错误处理中间件
import express from 'express';
import routes from './routes';
const app = express();
// 一次性挂载所有路由
app.use(routes);
// 全局错误处理中间件,所有未捕获的报错都在此处理,业务代码专注于业务逻辑即可
app.use((error, req, res, next) => {
  // 统一处理所有没有被捕获的报错
  res.status(200).json({ 
      code: -1, 
      message: error?.message || '服务器错误!', 
      data: null 
  });
});


// routes.js文件
import express from 'express';
const router = express.Router();
// 一个校验数据的方法(采用thorw来抛出错误的方式)
const validateData = (data) => {
    if (!data.name) {
        throw new Error('名称不能为空'); 
    }
}
// 一个在数据库表中新增一行数据的方法,在其中调用校验方法
const addRow = (data) => {
    // 校验数据
    validateData(data);
    // 数据库中新增数据
}
// 定义了一个路径为 /addRow 的路由,调用了 addRow 方法
router.get('/addRow', (req, res) => {
    addRow({ name: '' });
})

这样,不论是在多深层级的方法中用throw抛出一个错误,只要没有被捕获,都能在最外层处理。

为什么要“用throw抛出错误然后在全局错误处理中间件中处理”这样去做?

因为在后端业务逻辑复杂的情况下,可能会存在很多层级的代码调用,全部使用return来返回特定格式数据在编写和维护时较为复杂,而使用throw来抛出后统一处理有这些好处:

以上就是nodejs中使用throw进行异常处理的操作方法的详细内容,更多关于node throw异常处理的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文